簡體   English   中英

聯盟的兩只熊貓DataFrames

[英]Union of two pandas DataFrames

假設我有兩個數據框:

DF1:

  A
0 a
1 b

DF2:

  A
0 a
1 c

我想要的結果是兩幀的聯合與表示該行屬於源數據幀一個額外的列 如果有重復項,應刪除重復項,相應的額外列應顯示兩個來源:

  A  B
0 a  df1, df2
1 b  df1
2 c  df2

我可以得到連接數據框(df3)沒有重復,如下所示:

import pandas as pd
df3=pd.concat([df1,df2],ignore_index=True).drop_duplicates().reset_index(drop=True)

我想不出/找到一種方法可以控制哪個元素去哪里。 如何添加額外的列?

非常感謝您的任何提示。

合並indicator參數,並重新映射結果:

m = {'left_only': 'df1', 'right_only': 'df2', 'both': 'df1, df2'}

result = df1.merge(df2, on=['A'], how='outer', indicator='B')
result['B'] = result['B'].map(m)

result
   A         B
0  a  df1, df2
1  b       df1
2  c       df2

使用以下命令:

df3 = pd.concat([df1.assign(source='df1'), df2.assign(source='df2')]) \
    .groupby('A') \
    .aggregate(list) \
    .reset_index()

結果將是:

   A      source
0  a  [df1, df2]
1  b       [df1]
2  c       [df2]

assign將向您的數據幀添加名為source的列,其值為df1df2 groupby命令將具有相同A值的行分組到單行。 aggregate命令描述如何為具有相同A每組行聚合其他列( source )。 我使用了list aggregate函數,因此source列是具有相同A的值列表。

我們使用外連接來解決這個問題 -

df1 = pd.DataFrame({'A':['a','b']})
df2 = pd.DataFrame({'A':['a','c']})
df1['col1']='df1'
df2['col2']='df2'
df=pd.merge(df1, df2, on=['A'], how="outer").fillna('')
df['B']=df['col1']+','+df['col2']
df['B'] = df['B'].str.strip(',')
df=df[['A','B']]
df

   A        B
0  a  df1,df2
1  b      df1
2  c      df2

暫無
暫無

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

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