如何将带有不同集合的series.isin用于不同的值?

时间:2019-06-12 09:30:52

标签: python pandas

您知道我可以做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用作键,并且不能哈希。

2 个答案:

答案 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重组为DataFramemerge

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'])