Python 基于另一个数据帧向数据帧列添加值
我有一个数据帧,看起来像这样(df): 每行描述一个人的旅行。我有另一个相同类型的数据框,其中每一行描述一个人(df_p): 我想在第二个数据框中创建三个新列,以显示每个人的频率1、3和11。基本上我已经有了第二个带有其他特性的数据帧(df_p),所以我不应该使用groupby。由于某些原因,第一个和第二个数据帧的人数不相同。这就是为什么我需要下面的策略。这是我尝试过但花了数小时完成的代码(100万次迭代): 输出:Python 基于另一个数据帧向数据帧列添加值,python,pandas,Python,Pandas,我有一个数据帧,看起来像这样(df): 每行描述一个人的旅行。我有另一个相同类型的数据框,其中每一行描述一个人(df_p): 我想在第二个数据框中创建三个新列,以显示每个人的频率1、3和11。基本上我已经有了第二个带有其他特性的数据帧(df_p),所以我不应该使用groupby。由于某些原因,第一个和第二个数据帧的人数不相同。这就是为什么我需要下面的策略。这是我尝试过但花了数小时完成的代码(100万次迭代): 输出: HOUSEID PERSONID WHY_TRP_1
HOUSEID PERSONID WHY_TRP_1 WHY_TRP_3 WHY_TRP_11
20000017 1 3 0 0
20000017 2 1 1 0
20000231 1 0 0 2
20000231 2 0 0 1
20000521 1 0 0 1
20000521 2 0 1 1
有没有更快的方法
谢谢您可以通过在第一个数据帧上执行
groupby
并取消堆叠WHY_TRP
来获得计数表,然后您可以将其合并到第二个:
counts = df.groupby(["HOUSEID", "PERSONID", "WHY_TRP"]).apply(len).unstack(fill_value=0)
counts.columns = counts.columns.map(lambda x: f"WHY_TRP_{x}")
counts
WHY_TRP WHY_TRP_1 WHY_TRP_3 WHY_TRP_11
HOUSEID PERSONID
20000017 1 3 0 0
2 1 1 0
20000231 1 0 0 2
2 0 0 1
20000521 1 0 0 1
2 0 1 1
df2.merge(counts, how="left", left_on=["HOUSEID", "PERSONID"], right_index=True)
HOUSEID PERSONID WHY_TRP_1 WHY_TRP_3 WHY_TRP_11
0 20000017 1 3 0 0
1 20000017 2 1 1 0
2 20000231 1 0 0 2
3 20000231 2 0 0 1
4 20000521 1 0 0 1
5 20000521 2 0 1 1
您还可以执行
pivot\u表
,然后执行合并
:
m = df.pivot_table(index=['HOUSEID','PERSONID'],
columns='WHY_TRP',aggfunc=len,fill_value=0)
out= df_p.merge(m.add_prefix('WHY_TRP'),left_on=['HOUSEID','PERSONID'],right_index=True)
HOUSEID PERSONID WHY_TRP_1 WHY_TRP_3 WHY_TRP_11
20000017 1 3 0 0
20000017 2 1 1 0
20000231 1 0 0 2
20000231 2 0 0 1
20000521 1 0 0 1
20000521 2 0 1 1
counts = df.groupby(["HOUSEID", "PERSONID", "WHY_TRP"]).apply(len).unstack(fill_value=0)
counts.columns = counts.columns.map(lambda x: f"WHY_TRP_{x}")
counts
WHY_TRP WHY_TRP_1 WHY_TRP_3 WHY_TRP_11
HOUSEID PERSONID
20000017 1 3 0 0
2 1 1 0
20000231 1 0 0 2
2 0 0 1
20000521 1 0 0 1
2 0 1 1
df2.merge(counts, how="left", left_on=["HOUSEID", "PERSONID"], right_index=True)
HOUSEID PERSONID WHY_TRP_1 WHY_TRP_3 WHY_TRP_11
0 20000017 1 3 0 0
1 20000017 2 1 1 0
2 20000231 1 0 0 2
3 20000231 2 0 0 1
4 20000521 1 0 0 1
5 20000521 2 0 1 1
m = df.pivot_table(index=['HOUSEID','PERSONID'],
columns='WHY_TRP',aggfunc=len,fill_value=0)
out= df_p.merge(m.add_prefix('WHY_TRP'),left_on=['HOUSEID','PERSONID'],right_index=True)
print(out)
HOUSEID PERSONID WHY_TRP1 WHY_TRP3 WHY_TRP11
0 20000017 1 3 0 0
1 20000017 2 1 1 0
2 20000231 1 0 0 2
3 20000231 2 0 0 1
4 20000521 1 0 0 1
5 20000521 2 0 1 1