[英]How to join a column of lists in one dataframe with a column of strings in another 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
看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.