我不确定如何表达这个问题,但让我举个例子。我有2个熊猫数据框:
import pandas as pd
data1 = [['tom', '1000', 50], ['bill', '1001', 45], ['mike', '1002', 30], ['joe', '1003', 35]]
data2 = [['1000-000', 'New York'], ['1001-000', 'Los Angeles'], ['1005-000', 'Chicago'], ['1006-000', 'Atlanta']]
df1 = pd.DataFrame(data1, columns=['name', 'id', 'age'])
df2 = pd.DataFrame(data2, columns=['id #', 'city'])
两个数据框都有一个id
列,我想比较一下。但我需要缩短df2的id列才能这样做:
df2['id shortened'] = df2['id'].str[:4]
现在,我比较df1中的id
列和df2中的id shortened
列:
df3 = df1[df1['id #'].isin(df2['id shortened'])]
如果我打印df3,结果如下:
name id age
0 tom 1000 50
1 bill 1001 45
这很近,但是我真正想要的是:
name id age id #
0 tom 1000 50 1000-000
1 bill 1001 45 1001-000
id #
是什么很重要,但是我不确定在比较两个数据帧时如何将其包括在结果中?
答案 0 :(得分:2)
IIUC,您可以这样做:
df1.merge(df2.assign(id=df2['id #'].str.extract('^(.*)-')),
on='id',
)
输出:
name id age id # city
0 tom 1000 50 1000-000 New York
1 bill 1001 45 1001-000 Los Angeles
答案 1 :(得分:1)
您要使用的是DataFrame.merge()
方法:
>>> df2['id'] = df2['id #'].str[:4]
>>> df3 = df1.merge(df2, on='id')
>>> print(df3)
name id age id # city
0 tom 1000 50 1000-000 New York
1 bill 1001 45 1001-000 Los Angeles
您需要将id shortened
列命名为与您要在df1
中合并的列相同的名称,本例中为id
。如果您不希望使用诸如city
之类的其他列,则可以随后使用DataFrame.drop('city', axis=1)
将其删除。