我有一个具有这种结构的庞大熊猫数据帧:
df1:
A B
0 0 12
1 0 15
2 0 17
3 0 18
4 1 45
5 1 78
6 1 96
7 1 32
8 2 45
9 2 78
10 2 44
11 2 10
还有第二个,像这样小:
df2
G H
0 0 15
1 1 45
2 2 31
我想在遵循此规则的第一个数据框中添加一列:column df1.C = df2.H when df1.A == df2.G
我设法用for循环来做,但数据库很庞大,代码运行得非常慢,所以我正在寻找一个Pandas-way或numpy来做它。
非常感谢,
鲍里斯
答案 0 :(得分:2)
您可能想要使用合并:
I just got home.\n
Did you make lunch?\n
Oh, I see...
将为您提供一个包含3列的数据框,但第三个名称将为H
df=df1.merge(df2,left_on="A",right_on="G")
然后将为您提供所需的列名称
答案 1 :(得分:1)
如果您只想匹配两个数据框中的相互行:
import pandas as pd
df1 = pd.DataFrame({'Name':['Sara'],'Special ability':['Walk on water']})
df1
Name Special ability
0 Sara Walk on water
df2 = pd.DataFrame({'Name':['Sara', 'Gustaf', 'Patrik'],'Age':[4,12,11]})
df2
Name Age
0 Sara 4
1 Gustaf 12
2 Patrik 11
df = df2.merge(o, left_on='Name', right_on='Name', how='left')
df
Name Age Special ability
0 Sara 4 NaN
1 Gustaf 12 Walk on water
2 Patrik 11 NaN
这可以用多个匹配的参数完成: (在本示例中,df1中的Patrik在df2中不存在,因为它们的年龄不同,因此不会合并)
df1 = pd.DataFrame({'Name':['Sara','Patrik'],'Special ability':['Walk on water','FireBalls'],'Age':[12,83]})
df1
Name Special ability Age
0 Sara Walk on water 12
1 Patrik FireBalls 83
df2 = pd.DataFrame({'Name':['Sara', 'Gustaf', 'Patrik'],'Age':[4,12,11]})
df2
Name Age
0 Sara 4
1 Gustaf 12
2 Patrik 11
df = df2.merge(df1,left_on=['Name','Age'],right_on=['Name','Age'],how='left')
df
Name Age Special ability
0 Sara 12 Walk on water
1 Gustaf 12 NaN
2 Patrik 11 NaN
答案 2 :(得分:0)
df1['C'] = df1['A'].map(df2.set_index('G')['H'])
print (df1)
A B C
0 0 12 15
1 0 15 15
2 0 17 15
3 0 18 15
4 1 45 45
5 1 78 45
6 1 96 45
7 1 32 45
8 2 45 31
9 2 78 31
10 2 44 31
11 2 10 31
df = df1.merge(df2,left_on="A",right_on="G", how='left')
.drop('G', axis=1)
.rename(columns={'H':'C'})
print (df)
A B C
0 0 12 15
1 0 15 15
2 0 17 15
3 0 18 15
4 1 45 45
5 1 78 45
6 1 96 45
7 1 32 45
8 2 45 31
9 2 78 31
10 2 44 31
11 2 10 31
答案 3 :(得分:0)
这是一个矢量化的NumPy方法 -
B
可以使用idx = np.searchsorted(df2.G.values, df1.A.values)
df1['C'] = df2.H.values[idx]
以更简单的方式计算 idx
,但不要认为它会更高效,因为我们希望使用带有df2.G.searchsorted(df1.A)
的基础数组来提高性能如前所述。