[英]Merging two pandas DataFrames based on numerical column with different value, preserving unique variables from each
我正在嘗試合並 id 需要匹配的兩個 DataFrame,保留每個 DataFrame 的分類變量,並保留每個 id/類別的總和。 抱歉,如果措辭有點不清楚,基本上我是從兩個 Dataframes 開始的,每個 Dataframes 都為一些 ID 分配一個類別:
>>> print(df_a)
id cat_a sum_a
0 A blue 800
1 B blue 500
2 B green 500
3 C yellow 550
4 D red 1000
>>> print(df_b)
id cat_b sum_b
0 A square 700
1 A triangle 100
2 B circle 700
3 B triangle 300
4 C pentagon 550
5 D line 800
6 D triangle 200
查看 id=B,在 cat_a 中 500/1000 是藍色,500/1000 是綠色,在 cat_b 中 700/1000 是圓形,300/1000 是三角形。
兩個 DataFrame 的每個 ID 的總數相同:
>>>print(df_a.groupby('id')['sum_a'].sum() == df_b.groupby('id')['sum_b'].sum())
id
A True
B True
C True
D True
我想創建一個新的DataFrame,df_c,它將類別組合並在sum_c中分配總和,使得原始總和仍然與其原始DataFrames一致。 這是一個手工制作的例子:
>>> print(df_c)
id cat_a cat_b sum_c
0 A blue square 700
1 A blue triangle 100
2 B blue circle 500
3 B green circle 200
4 B green triangle 300
5 C yellow pentagon 550
6 D red line 800
7 D red triangle 200
我可以通過在其組成數據幀中執行 groupby 來確認 df_c 是正確的,並檢查它是否與原始數據匹配:
>>> df_c2a = df_c.groupby(['id', 'cat_a'], as_index=False)['sum_c'].sum()
>>> print(np.all(df_a.values == df_c2a.values))
True
>>> df_c2b = df_c.groupby(['id', 'cat_b'], as_index=False)['sum_c'].sum()
>>> print(np.all(df_b.values == df_c2b.values))
True
目前,我對如何從前兩個中創建第三個 DataFrame、df_c 感到困惑。 關於實現這一目標的最佳方法的任何建議?
我嘗試在“id”上進行左合並,但是我似乎無法得到匹配的總和
>>> df_c = df_a.merge(df_b, how='left', on='id')
>>> df_c['sum_c'] = df_c['sum_b']
>>> df_c = df_c.drop(['sum_a', 'sum_b'], axis=1)
>>> df_a_group = df_c.groupby(['id', 'cat_a'], as_index=False)['sum_c'].sum().reset_index(drop=True)
>>> print(df_a)
id cat_a sum_a
0 A blue 800
1 B blue 500
2 B green 500
3 C yellow 550
4 D red 1000
>>> print(df_a_group)
id cat_a sum_c
0 A blue 800
1 B blue 1000
2 B green 1000
3 C yellow 550
4 D red 1000
您可以合並兩個數據框:
df_c = df_a.merge(df_b, on = 'id', how = 'outer')
df_c['sum_c'] = df_c.apply(lambda x: x['sum_b']/2 if x['id'] == 'B' else x['sum_b'], axis = 1)
如果您的數據看起來不同,您只需要計算如何分配總和。 在您的示例中,只有 id B 才需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.