比较两个不同大小的Pandas Dataframe

f45qwnt8  于 2023-01-19  发布在  其他
关注(0)|答案(4)|浏览(134)

我有一个庞大的Pandas数据框架,它的结构是这样的:

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

我想按照以下规则向我的第一个 Dataframe 添加一列:column df1.C = df2.H when df1.A == df2.G
我设法做到这一点与循环,但数据库是巨大的,代码运行真的很慢,所以我正在寻找一个Pandas的方式或麻木做它。
非常感谢,
鲍里斯

ovfsdjhp

ovfsdjhp1#

如果只想匹配两个 Dataframe 中的共有行:

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(df1, 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
mwg9r5ms

mwg9r5ms2#

您可能需要使用合并:

df=df1.merge(df2,left_on="A",right_on="G")

我会给予你一个有3列的 Dataframe ,但是第三列的名字是H

df.columns=["A","B","C"]

然后,我将为您提供所需的列名

dpiehjr4

dpiehjr43#

您可以通过set_index创建的Series使用map

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
ldioqlga

ldioqlga4#

这是一个向量化的NumPy方法

idx = np.searchsorted(df2.G.values, df1.A.values)
df1['C'] = df2.H.values[idx]

idx可以以更简单的方式计算为:df2.G.searchsorted(df1.A),但不要认为这会更有效,因为我们希望使用.values的底层数组来提高性能,如前所述。

相关问题