我有以下两个熊猫DataFrame:
第一个:
df1 = pd.DataFrame({'Name':['John','John','John','Paul','Paul','Jimmy'], 'Book':['B1','B2','B1','B3','B4','B3']})
╔═══════╦══════╗
║ Name ║ Book ║
╠═══════╬══════╣
║ John ║ B1 ║
║ John ║ B2 ║
║ John ║ B1 ║
║ Paul ║ B3 ║
║ Paul ║ B4 ║
║ Jimmy ║ B3 ║
╚═══════╩══════╝
第二个:
df2 = pd.DataFrame({'Name':['John','Paul','Jimmy'], 'Age':[25,18,28]})
╔═══════╦═════╗
║ Name ║ Age ║
╠═══════╬═════╣
║ John ║ 25 ║
║ Paul ║ 18 ║
║ Jimmy ║ 28 ║
╚═══════╩═════╝
我希望结果是:
╔═══════╦══════╦═════╗
║ Name ║ Book ║ Age ║
╠═══════╬══════╬═════╣
║ John ║ B1 ║ 25 ║
║ John ║ B2 ║ 25 ║
║ John ║ B1 ║ 25 ║
║ Paul ║ B3 ║ 18 ║
║ Paul ║ B4 ║ 18 ║
║ Jimmy ║ B3 ║ 28 ║
╚═══════╩══════╩═════╝
也就是说,使用“名称”列作为键,将“年龄”列添加到第一数据框,并保留重复的名称。
答案 0 :(得分:4)
这很简单:
df1 = pd.DataFrame({'Name':['John','John','John','Paul','Paul','Jimmy'], 'Book':['B1','B2','B1','B3','B4','B3']})
df2 = pd.DataFrame({'Name':['John','Paul','Jimmy'], 'Age':[25,18,28]})
df1.merge(df2)
Out[22]:
Name Book Age
0 John B1 25
1 John B2 25
2 John B1 25
3 Paul B3 18
4 Paul B4 18
5 Jimmy B3 28
答案 1 :(得分:2)
使用import pandas as pd
df = pd.DataFrame({'id':[1,1,2,2,2,4],
'wave':['C','A','A','B','C','A']})
df['wave_num'] = df['wave'].apply(lambda x: ord(x))
df['difference'] = df.groupby('id')['wave_num'].diff()
list(df.loc[(df.difference<0)]['id'].unique())
和set_index
:
map
输出:
df1['Age'] = df1['Name'].map(df2.set_index('Name')['Age'])
print(df1)
映射将比合并更快,因为我们仅映射单个列。
%timeit df1 ['Age'] = df1 ['Name']。map(df2.set_index('Name')['Age'])
每个循环1.22 ms±34.4 µs(平均±标准偏差,共运行7次,每个循环1000个)%timeit df1.merge(df2)
每个循环2.93 ms±73.3 µs(平均±标准偏差,共运行7次,每个循环100个循环)