python - 根据另一个数据框向熊猫数据框列添加值
问题描述
我有一个看起来像这样的数据框(df):
HOUSEID PERSONID WHY_TRP
20000017 1 1
20000017 1 1
20000017 1 1
20000017 2 1
20000017 2 3
20000231 1 11
20000231 1 11
20000231 2 11
20000521 1 11
20000521 2 11
20000521 2 3
每行描述一个人的一次旅行。我有另一个相同类型的数据框,其中每一行描述一个人(df_p):
HOUSEID PERSONID
20000017 1
20000017 2
20000231 1
20000231 2
20000521 1
20000521 2
我想在第二个数据框中创建三个新列,以显示每个人 1、3 和 11 的频率。基本上我已经有了第二个具有其他功能的数据帧(df_p),所以我不应该使用 groupby。由于某种原因,第一个和第二个数据框的人数不同。这就是为什么我需要下面的策略。这是我尝试过的代码,但需要数小时才能完成(100 万次迭代):
df_p.insert(2, 'WHY_TRP_1', 0)
df_p.insert(3, 'WHY_TRP_2', 0)
df_p.insert(4, 'WHY_TRP_3', 0)
def trip_counter(i, r):
if r[2] == 1:
df_p.loc[(df_p['HOUSEID'] == r[0]) & (df_p['PERSONID'] == r[1]), ['WHY_TRP_1']] += 1
elif r[2] == 3:
df_p.loc[(df_p['HOUSEID'] == r[0]) & (df_p['PERSONID'] == r[1]), ['WHY_TRP_3']] += 1
elif r[2] == 11:
df_p.loc[(df_p['HOUSEID'] == r[0]) & (df_p['PERSONID'] == r[1]), ['WHY_TRP_11']] += 1
for i ,r in df.iterrows():
trip_counter(i ,r)
输出:
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
您可以通过在第一个数据帧上执行 a 和 unstacking来获得计数表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
推荐阅读
- python - 导入错误
- seaborn - seaborn distplot图中的y轴是什么?
- c# - asp.net中只有一个线程处理一页吗?
- python - 通过扩展用户模型中的电话字段登录
- python-2.7 - 无法使用 Anaconda 4.3.1(64 位)和 Python 2.7.13 连接到 Teradata
- neo4j - Neo4j:如何通过距离为每个节点查找下一个邻居并创建关系
- c++ - 为什么代码会抛出非法内存访问错误
- javascript - Angular *ngFor“id”标签生成不正确与`mat-button-toggle`
- azure-devops - 我可以将现有的 NuGet 包上传到 Azure DevOps 工件源吗?
- javascript - 如何使用 Tornado > 4.1 从 HTML5 表单上传大文件