簡體   English   中英

基於具有不同值的數值列合並兩個 pandas 數據幀,保留每個數據幀的唯一變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM