比较两个不同大小的pandas数据帧

时间:2017-06-07 14:02:21

标签: python pandas numpy

我有一个具有这种结构的庞大熊猫数据帧:

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来做它。

非常感谢,

鲍里斯

4 个答案:

答案 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)

您可以map创建的Series使用set_index

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

mergedroprename

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)的基础数组来提高性能如前所述。