首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并不同长度的DataFrames

合并不同长度的DataFrames
EN

Stack Overflow用户
提问于 2015-06-06 19:19:07
回答 1查看 2.9K关注 0票数 0

我的第一个DataFrame看起来如下:

代码语言:javascript
复制
ESD    Species      Key1
Sub       POAP     SubPOAP
Sub       FRAP     SubFRAP
Sand      POAP     SandPOAP
Sand      ACER     SandACER
Sand      SALI     SandSALI

因此,Key1是静电放电和物种的连接。

我的第二个DataFrame看起来如下:

代码语言:javascript
复制
ESD  Species      Values     Key
Sub      POAP       10     SubPOAP 
Sub      FRAP       20     SubFRAP

因此,我想将第二帧加入到基于Key1Key的第一个框架中,但是第一个DataFrame更大,我仍然希望在新的DataFrame中保留不匹配的列(用ESD作为沙子)。最后,我将合并任何与ESD的沙子也。

到目前为止,我已经使用了这段代码,并将'Key1‘和'Key’设置为索引:

代码语言:javascript
复制
merge=pd.merge(df, df2, left_index='True', right_index='True') 

但这不会保留没有匹配键的列。也许我需要的是一个连接而不是一个合并吗?

这一守则的结果是:

代码语言:javascript
复制
 ESD    Species      Key1      Values
 Sub       POAP     SubPOAP     10 
 Sub       FRAP     SubFRAP     20

期望的输出是:

代码语言:javascript
复制
ESD    Species      Key1      Values
Sub       POAP     SubPOAP     10 
Sub       FRAP     SubFRAP     20
Sand      POAP     SandPOAP    NaN
Sand      ACER     SandACER    NaN
Sand      SALI     SandSALI    NaN

我并不关心重复的列标题是否会传递到联接中,我将只删除它们(有两个列命名为物种)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-06 19:31:44

与其将ESDSpecies连接到一个字符串中,不如在列列表上合并:

代码语言:javascript
复制
result = pd.merge(df, df2, on=['ESD', 'Species'], how='left')

若要在result中为df中的每一行保留一行(即执行左连接。),请使用how='left'

代码语言:javascript
复制
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)

收益率

代码语言:javascript
复制
    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是这样的,

代码语言:javascript
复制
ESD    Species      Key1
FOO       BAR      FOOBAR
FOOB      AR       FOOBAR

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

这可能影响您,也可能不会影响您,但由于理论上它可能导致错误,而且由于您可以直接在['ESD', 'Species']上合并,所以最好避免连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30686657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档