簡體   English   中英

通過鍵列加入 Dataframe 列表

[英]Join Lists of Dataframe by key column

我在 python 中有兩個數據幀(這里只有 df.head(3)):

df1

第 1 列 第 2 列 第 3 列 第 4 列 第 5 列
1a 123 RJ 12.1 測試1
2a 432 公噸 23.2 測試3
3a 234 博士 34.3 測試5

df2

第 1 列 第 3 列 第 6 欄
1a RJ 695
2a 公噸 568
3a 博士 232

我創建了一個列表,將每個 dataframe 按 Column1 分組,對於 Column1 的每個值都有一個表(很多行):

list_df1 =[]
grouped = df1.groupby('Column1')

for name, group in grouped:
    if name == 0:
        group = group.merge(df1,how='left')
    elif name == 1:
        group = group.merge(df1,how='left')
    list_df1.append(group)
pd.concat(list_df1)

對df2做了同樣的事情:

list_df2 =[]
grouped = df2.groupby('Column1')

for name, group in grouped:
    if name == 0:
        group = group.merge(df2,how='left')
    elif name == 1:
        group = group.merge(df2,how='left')
    list_df2.append(group)
pd.concat(list_df2)

我需要的是通過 Column1 加入這兩個列表

這個連接的結果應該是這樣的:

          final_list = ([list_df1.Column1(1a) , list_df2.Column1(1a)] ,

                       [list_df1.Column1(2a) , list_df2.Column1(2a)] , 

                       [list_df1.Column1(3a) , list_df2.Column1(3a)] )

最后,對於 Column1 的每個值,我將有一個 CSV 文件(由 pipe“|”分隔)附加分組數據幀 list_df1 和 list_df2。

CSV 1a

 1a|123|RJ|12.1|test1

 1a|XXX|YY|000|testx

...

 1a|RJ|695

 1a|XX|000

...

CSV 2a

 2a|432|MT|23.2|test3

 2a|XXX|YY|000|testx

....

 2a|MT|568

 2a|XX|000

...

CSV 3a

 3a|234|DR|34.3|test5

 3a|XXX|YY|000|testx

...

 3a|DR|232

 3a|XX|000

...

有任何想法嗎? 提前致謝。

對於 DF1,我看到您使用了答案的變體,但是,您目前正在將所有組與相同的 DataFrame 合並,因此您不需要額外的選擇結構來有條件地合並。

對於 DF2,您只需過濾 DF2。 在這種情況下,將其與自身合並是多余的。 因此,您只需 select 將 df2 中的值作為 df1 的第 1 列中的組。

您可以使用理解從 df1 的 groupbys 構建您的 final_lst。 將每個組與 df2 合並,並讓另一個條目只是 column1 中的值與組名匹配的行。

就像是:

import pandas as pd

df1 = pd.DataFrame({'Column1': {0: '1a', 1: '2a', 2: '3a'},
                    'Column2': {0: 123, 1: 432, 2: 234},
                    'Column3': {0: 'RJ', 1: 'MT', 2: 'DR'},
                    'Column4': {0: 12.1, 1: 23.2, 2: 34.3},
                    'Column5': {0: 'test1', 1: 'test3', 2: 'test5'}})
df2 = pd.DataFrame({'Column1': {0: '1a', 1: '2a', 2: '3a'},
                    'Column3': {0: 'RJ', 1: 'MT', 2: 'DR'},
                    'Column6': {0: 695, 1: 568, 2: 232}})

final_list = ([group.merge(df2, how='left'),
               df2[df2['Column1'] == name].reset_index(drop=True)]
              for name, group in df1.groupby('Column1'))

# For Display
for merged, filtered_df2 in final_list:
    print(f"csv {merged['Column1'].iloc[0]}")
    print(merged.to_string(index=False, header=False))
    print('-----')
    print(filtered_df2.to_string(index=False, header=False))
    print()

Output:

csv 1a
1a 123 RJ 12.1 test1 695
-----
1a RJ 695

csv 2a
2a 432 MT 23.2 test3 568
-----
2a MT 568

csv 3a
3a 234 DR 34.3 test5 232
-----
3a DR 232

看:

  1. 將 pandas groupby object 轉換為數據幀列表
  2. 如何根據列值從 DataFrame 中的 select 行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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