您知道我可以做df[df.column.isin(set)]
来获取DataFrame中该列值所在的部分。但是现在我的源集取决于column1的值。我如何使函数查找字典成为旅途中源集的字典,因为它可以过滤数据帧?
假设我有
dict1={'a':[1,2,3],'b':[1,2],'c':[4,5,6]}
我的df看起来像
column1 column2
a 4
b 2
c 6
新的df应该看起来像
column1 column2
b 2
c 6
由于列表d中'a'所指向的列表中没有4。
new_df = df[df.column2.isin(dict1[df.column1])]
这给我TypeError。我理解了,因为我将pd.Series用作键,并且不能哈希。
答案 0 :(得分:3)
问题在于isin
期望值的序列,而不是序列的序列。换句话说,它允许对键进行矢量化,但不允许对值进行矢量化。
因此,您必须在此处使用非矢量化方式,例如:
df[df.apply(lambda x: x['column2'] in dict1[x['column1']], axis=1)]
答案 1 :(得分:2)
您可以使用列表理解和pandas.concat
。在理解中,将boolean indexing
与逻辑AND(&
)运算符配合使用:
df_new = pd.concat([df[df['column1'].eq(k) & df['column2'].isin(v)] for k, v in dict1.items()])
[出]
column1 column2
1 b 2
2 c 6
另一种方法是将dict
重组为DataFrame
和merge
:
df_dict = pd.DataFrame([(k, i) for k, v in dict1.items() for i in v], columns=['column1', 'column2'])
df.merge(df_dict, how='inner', on=['column1', 'column2'])