繁体   English   中英

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

[英]Merge two python pandas data frames of different length but keep all rows in output data frame

我有以下问题:我有两个不同长度的 pandas 数据框,其中包含一些具有共同值和一些不同值的行和列,如下所示:

df1:                                 df2:

      Column1  Column2  Column3           ColumnA  ColumnB ColumnC
    0    a        x        x            0    c        y       y
    1    c        x        x            1    e        z       z
    2    e        x        x            2    a        s       s
    3    d        x        x            3    d        f       f
    4    h        x        x
    5    k        x        x            

我现在要做的是合并两个数据帧,这样如果 ColumnA 和 Column1 具有相同的值,则来自 df2 的行将附加到 df1 中的相应行,如下所示:

df1:
    Column1  Column2  Column3  ColumnB  ColumnC
  0    a        x        x        s        s
  1    c        x        x        y        y
  2    e        x        x        z        z
  3    d        x        x        f        f
  4    h        x        x        NaN      NaN
  5    k        x        x        NaN      NaN

我知道合并是可行的

df1.merge(df2,left_on='Column1', right_on='ColumnA')

但是此命令会删除两个文件中 Column1 和 ColumnA 中所有不相同的行。 相反,我想将这些行保留在 df1 中,并在其他行具有来自 df2 的值的列中为它们分配 NaN,如上所示。 在熊猫中有没有一种流畅的方法来做到这一点?

提前致谢!

您可以在此处阅读文档:http: //pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html

您正在寻找的是左连接。 默认选项是内部联接。 您可以通过传递不同的 how 参数来更改此行为:

df1.merge(df2,how='left', left_on='Column1', right_on='ColumnA')

看起来您正在寻找类似左连接的东西。 看看这个例子是否有帮助:http: //pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html#left-outer-join

您基本上可以将参数传递给名为how='left' merge()

您也可以简单地将合并与 using on 和 list 一起使用

result = df1.merge(df2, on=['Column1'])

欲了解更多信息,请点击链接

使用“concat”怎么样?

数据框列内容不需要相同/匹配,它会附加。

import pandas as pd
from io import StringIO

csvfile = StringIO(
"""Column1  Column2 Column3
a   x   x
c   x   x
e   x   x
d   x   x
h   x   x
k   x   x
""")
    
csvfile_1 = StringIO(
"""ColumnA  ColumnB ColumnC
c   y   y
e   z   z
a   s   s
d   f   f
""")

df = pd.read_csv(csvfile, sep = '\t', engine='python')
df_1 = pd.read_csv(csvfile_1, sep = '\t', engine='python')

df_1 = df_1.rename({'ColumnA':'Column1'}, axis='columns')
    
df.set_index('Column1',inplace=True)
df_1.set_index('Column1',inplace=True)
    
# column contents no need to be the same, it will append
df_final = pd.concat([df,df_1],axis=1,sort=False).reset_index()

print (df_final)

输出为:

  index Column2 Column3 ColumnB ColumnC
0     a       x       x       s       s
1     c       x       x       y       y
2     e       x       x       z       z
3     d       x       x       f       f
4     h       x       x     NaN     NaN
5     k       x       x     NaN     NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM