大熊猫Dataframe中列表中的'Where子句'

时间:2014-09-30 04:26:45

标签: python pandas dataframe

我有这种pandas Datamframe名为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

2 个答案:

答案 0 :(得分:5)

这不起作用的原因:

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]

答案 1 :(得分:1)

将列表列表与单个条目进行比较。您应该使用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)

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