合并不同长度的DataFrame

时间:2015-06-06 19:19:07

标签: python pandas

我的第一个DataFrame看起来像这样:

ESD    Species      Key1
Sub       POAP     SubPOAP
Sub       FRAP     SubFRAP
Sand      POAP     SandPOAP
Sand      ACER     SandACER
Sand      SALI     SandSALI

因此Key1是ESD和物种的串联。

我的第二个DataFrame看起来像这样:

ESD  Species      Values     Key
Sub      POAP       10     SubPOAP 
Sub      FRAP       20     SubFRAP

所以我想基于Key1Key将第二帧加入到第一帧,但第一个DataFrame更大,我仍然希望保留不匹配的列(使用ESD作为Sand)在新的DataFrame中。最终,我也会将任何东西与Sand of ESD合并。

到目前为止,我已使用此代码并将'Key1'和'Key'设置为索引:

merge=pd.merge(df, df2, left_index='True', right_index='True') 

但是这不会保留没有匹配键的列。或许加入而不是合并是我需要的吗?

此代码导致:

 ESD    Species      Key1      Values
 Sub       POAP     SubPOAP     10 
 Sub       FRAP     SubFRAP     20

所需的输出是:

ESD    Species      Key1      Values
Sub       POAP     SubPOAP     10 
Sub       FRAP     SubFRAP     20
Sand      POAP     SandPOAP    NaN
Sand      ACER     SandACER    NaN
Sand      SALI     SandSALI    NaN

我真的不在乎重复的列标题是否会转移到连接,我只是删除它们(有两列名为Species)。

1 个答案:

答案 0 :(得分:2)

不是将ESDSpecies连接成一个字符串, 最好合并列:

result = pd.merge(df, df2, on=['ESD', 'Species'], how='left')

要为result中的每一行(perform a left-join)保留一行df,请使用how='left'

import pandas as pd
try:
    # for Python2
    from cStringIO import StringIO 
except ImportError:
    # for Python3
    from io import StringIO

df = pd.read_table(StringIO('''\
ESD    Species      Key1
Sub       POAP     SubPOAP
Sub       FRAP     SubFRAP
Sand      POAP     SandPOAP
Sand      ACER     SandACER
Sand      SALI     SandSALI'''), sep='\s+')


df2 = pd.read_table(StringIO('''\
ESD  Species      Values     Key
Sub      POAP       10     SubPOAP 
Sub      FRAP       20     SubFRAP'''), sep='\s+')

result = pd.merge(df, df2, on=['ESD', 'Species'], how='left')
print(result)

产量

    ESD Species      Key1  Values      Key
0   Sub    POAP   SubPOAP      10  SubPOAP
1   Sub    FRAP   SubFRAP      20  SubFRAP
2  Sand    POAP  SandPOAP     NaN      NaN
3  Sand    ACER  SandACER     NaN      NaN
4  Sand    SALI  SandSALI     NaN      NaN

请注意,如果df看起来像这样,

ESD    Species      Key1
FOO       BAR      FOOBAR
FOOB      AR       FOOBAR

然后可以将两个不同的(ESD, Species)对映射到同一个Key1 - 即FOOBAR。因此,连接字符串以产生用于目的的键 合并可能会导致错误。

这可能会或可能不会影响您,但因为理论上它可能导致错误,并且 既然你可以直接在['ESD', 'Species']上合并,最好避免使用。{1}} 串联。