Pandas数据框中列表中的“Where子句”

2024-04-19 19:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一种叫df的熊猫数据帧:

     email        | list
___________________________
email1@email.com  | [0,1]
email1@email.com  | [2,1]
email1@email.com  | [0,3]
email1@email.com  | [0,0]
email1@email.com  | [0,1]

我想从具有0列表的df中检索所有行:[0,0]

我在做:

df2 = df[df['list'] == [0,0]]

但我得到了以下错误:

ValueError: Arrays were different lengths: 5 vs 2

Tags: 数据comdf列表email错误listvs
2条回答

将列表列表与单个条目进行比较。您应该使用iterrows()来过滤df。iterrows()创建生成元组的生成器,其第二个条目是列字典。您可以遍历它们并与之匹配,然后构建一个新的数据帧。

df2 = {'email':[], 'list':[]}
for row in df.iterrows():
    row_dictionary = row[1]
    if row_dictionary['list'] == [0,0]:
        for key in df2.keys():
            df2[key].append(row_dictionary[key])
df2 = pandas.DataFrame.from_dict(df2)

通过使用字典的键来填充它,您可以在任何数据帧上使用此方法。

这不起作用的原因是:

df2 = df[df['list'] == [0, 0]]

因为df['list']是一个5元素长的列表,而[0, 0]是一个两元素长的列表。在评估你的面具时失败了

df['list'] == [0, 0]

更新正确的解决方案

我认为解决这个问题的最快方法是创建一系列数据帧长度为[0,0]的元素,并将这个系列与您的列进行比较

df['list'] == pd.Series([[0, 0]] * len(df))

0    False
1    False
2    False
3    True
4    False

这通过将列表中的每个元素[0, 0]进行比较而不是将列表df['list'][0, 0]进行比较来创建掩码

使用此掩码,然后可以创建新的数据帧

mask = df['list'] == pd.Series([[0, 0]] * len(df))
df2 = df[mask]

相关问题 更多 >