我有这种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
答案 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)
通过使用字典的键来填充它,您可以在任何数据帧上使用此方法。