Pandas:匹配来自两个数据帧的值 - 多对一

Pandas: Match values from two dataframes - Many to One

我有两个数据框需要按行匹配。在匹配发生的地方,我需要增加 df1 中字段的值 +1。 df2 与 df1 有多个匹配项。我不想合并数据帧,只是根据与 df2 的匹配更新 df1。

我脑子里的基本逻辑是读取df1的第一行,然后尝试将TRANID匹配到df2的每一行。当匹配发生时,将 +1 添加到 NUMINSTS 值。然后循环回来并对 df1 上的下一行执行相同的操作。我只是不确定如何在 Python/Pandas.

中解决这个问题

我是一名老 COBOL 程序员,刚刚开始学习 Python/Pandas,非常感谢任何帮助。

    Input Data
    
    df1:
    
    TRANID      NUMINSTS
    60000022    22
    60000333    6
    70000001    15
    70000233    60
    
    df2:

    TRANID
    60000333
    70000233
    70000233

    Output

    df3:

    TRANID      NUMINSTS
    60000022    22
    60000333    7   #incremented by 1
    70000001    15
    70000233    62  #incremented by 2

我们可以根据 df2 中的值进行过滤,并不断添加或更改 df1 中的值。

import pandas as pd

df1 = pd.DataFrame({"TRAINID":["60000022", "60000333", "70000001", "70000233"], "NUMINSTS":[22,6,15,60]})
df2 = pd.DataFrame({"TRAINID":[ "60000333", "70000233", "70000233"]})

def add_num(df1,df2):
    for id in list(df2["TRAINID"]):
        df1.loc[df1["TRAINID"] == id, "NUMINSTS"] += 1
    return df1

df3 = add_num(df1,df2)
print(df3)

你可以试试:

    df1 = pd.DataFrame({'TRANID':[60000022, 60000333, 70000001, 70000233],
'NUMINSTS':[22,6,15,60]})

df1:

    TRANID  NUMINSTS
0   60000022          22
1   60000333           6
2   70000001          15
3   70000233          60

df2 = pd.DataFrame({'TRANID':[60000333, 70000233, 70000233]})

df2:

    TRANID
0   60000333
1   70000233
2   70000233

从 df2 构建一个 TRANID 值计数字典:

d = df2['TRANID'].value_counts().to_dict()

从 df1 复制 df3 并更新 NUMINSTS 列,就像 TRANID 在上面的字典中一样,增加值计数,否则保持不变:

df3 = df1.copy()


df3['NUMINSTS'] = df3.apply(
        lambda row: 
    row['NUMINSTS']+d[row['TRANID']] if row['TRANID'] in d else row['NUMINSTS'], axis=1)

如果您不想要不匹配的行,您可以像下面那样替换 None,然后删除具有 None 值的行:

df3['NUMINSTS'] = df3.apply(
            lambda row: 
        row['NUMINSTS']+d[row['TRANID']] if row['TRANID'] in d else None, axis=1)
df3.dropna(subset=['NUMINSTS'], inplace=True)
df3['NUMINSTS'] = df3['NUMINSTS'].astype(int)
df3.reset_index(inplace=True,drop=True)

输出 df3:

    TRANID    NUMINSTS
0   60000333         7
1   70000233        62

您想要两种情况:

  1. df1 中存在 Tranid
  2. df1 中不存在 Tranid。

这是您的代码:

import pandas as pd
df1=pd.DataFrame({'tranid':[1,2,3],'numinst':[2,4,6]})
df2=pd.DataFrame({'tranid':[1,2,4]})
tranvalues=df1['tranid']
for i in range(len(df2)):
    if df2['tranid'][i] in tranvalues:
        df1['numinst'][df1['tranid']==df2['tranid'][i]]=df1['numinst']+1
    else:
        df1.loc[len(df1.index)]=[df2['tranid'][i],1]