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
您想要两种情况:
- df1 中存在 Tranid
- 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]
我有两个数据框需要按行匹配。在匹配发生的地方,我需要增加 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
您想要两种情况:
- df1 中存在 Tranid
- 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]