[英]adding values to pandas dataframe columns based on another dataframe
我有一個 dataframe 看起來像這樣(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
每行描述一個人的一次旅行。 我還有另一個 dataframe ,其中每一行都描述了一個人(df_p):
HOUSEID PERSONID
20000017 1
20000017 2
20000231 1
20000231 2
20000521 1
20000521 2
我想在第二個 dataframe 中創建三個新列,以顯示每個人的頻率 1、3 和 11。 基本上我已經有了第二個 dataframe (df_p) 和其他功能,所以我不應該使用 groupby。 由於某種原因,第一個和第二個 dataframe 的人數不一樣。 這就是為什么我需要下面的策略。 這是我嘗試過的代碼,但需要數小時才能完成(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)
output:
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
有沒有更快的方法來做到這一點?
謝謝你
您可以通過在第一個 dataframe 上執行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_table
然后merge
:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.