我的目标
我正在尝试创建一个新的数据框,该数据框是通过比较不同数据框的列而形成的。
更具体地说,当 ColumnA
中的列值与 ColumnB
中不相似/不存在时, 整行将被忽略且不包含在内在new_df
数据框
>>> df
ColumnA Stats
0 Cake 872
1 Cheese Cake 912
2 Egg 62
3 Raspb Jam 091
4 Bacon 123
5 Bread 425
>>> df1
ColumnB
0 Cake
1 Cheese Cake
3 Raspberry Jam
4 Bacon
我的尝试
由于我不确定如何实现这一目标,因此我已尽力生成以下内容,尽管我知道它可能不会达到我的预期输出:
new_df = df[df['ColumnA'].str.strip() in df1['ColumnB'].str.split()]
错误:
TypeError: 'Series' objects are mutable, thus they cannot be hashed
预期输出
如您所见,对于 df1
中不存在的列值,这些行将从 df
中删除。在本例中,Bread
和 Egg
都不存在,因此 new_df 不包含它们的行
>>> new_df
ColumnA Stats
0 Cake 872
1 Cheese Cake 912
3 Raspberry Jam 091
4 Bacon 123
<小时/>
编辑:
Raspb Jam
也保留在新的 DF 中,因为它在非常基础的层面上与 Raspberry Jam 类似。
最佳答案
您可以使用映射函数来提供显式查找。
df = DataFrame( {'ColumnA' : ['Cake' ,'Cheese Cake','Egg' , 'Raspb Jam' ,'Bacon' ,'Bread'],'Value' : [872,912,62,91,123, 425]})
df1 = DataFrame(['Cake' ,'Cheese Cake','Raspberry Jam','Bacon'],columns=['ColumnB'])
value_map = {'Raspberry Jam' : 'Raspb Jam' }
df1.ColumnB = df1.ColumnB.map(lambda x : value_map.get(x,x))
df1.rename(columns={'ColumnB' : 'ColumnA'},inplace=True)
df.merge(df1)
ColumnA Value
0 Cake 872
1 Cheese Cake 912
2 Raspb Jam 91
3 Bacon 123
或者,使用 left_on 和 right_on 参数指定要合并的列名称。
df.merge(df1,how='inner',left_on='ColumnA',right_on='ColumnB')[['ColumnA','Value']]
关于python - 当数据框 B 中的列值不相似时,从数据框 A 中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41419371/