【问题标题】:Merge columns with same header no duplicate columns合并具有相同标题的列,没有重复的列
【发布时间】:2017-01-20 19:54:45
【问题描述】:

所以我尝试查看许多文章,解释如何合并或连接、连接等在 python 中适用于 pandas,或者只是一般 r。当我用我的数据测试它时,似乎没有什么能以我需要的方式工作。我将发布具有任意数字和标题的示例数据,这些数据具有我的数据的特征以及我希望它在最终产品中的外观。我通常尝试使用 Genus 作为我的常用列,因为该列具有最常见的信息,而所有其他列都是描述该列的信息。这些是文本文件。

数据框 1:

Genus    Data    Facts    Info
Dog    1    2    N/A
Cat    3    1    N/A
Elephant    N/A    3    3
Pig    N/A    N/A    N/A
Mouse    N/A    N/A    N/A

数据框 2:

Genus    Info    Stats
Dog    2    3
Cat    1    2
Elephant    N/A    1
Pig    N/A    N/A
Mouse    N/A    N/A
Bird    N/A    N/A

期望的结果:

Genus    Data    Facts    Info    Stats
Dog    1    2    2    3
Cat    3    1    1    2
Elephant    N/A    3    3    1
Pig    N/A    N/A    N/A    N/A
Mouse    N/A    N/A    N/A    N/A
Bird    N/A    N/A    N/A    N/A

有没有办法使用 python 或 r 创建这个结果?我对 python 和 r 有点陌生,不知道 /all/ 的来龙去脉,所以我可能只是遗漏了一些东西或没有使用正确的术语进行搜索,但我已经尝试了大约 3 周,现在正在阅读其他人对类似情况做了什么,并试图从中获利。我不能使用 Excel,因为它会自动将一些数字输入更改为日期并进行其他小的更改,如果有人试图重做它,他们可能不会意识到要修复这些细微差别。

【问题讨论】:

    标签: python r


    【解决方案1】:

    以下是在 python 中使用 pandas 的方法:

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame(np.random.randn(3,4), columns=['a','b','c','d']
    df2 = pd.DataFrame(np.random.randn(3,2), columns=['e','f'])
    
    pd.concat([df1, df2], axis=1)
    #          a         b         c         d         e         f
    # 0 -1.181554  0.918146  0.547498 -0.409452 -1.852066 -0.377525
    # 1  0.508757  0.219863  1.945935  1.285512 -0.076156  0.172197
    # 2 -0.186153 -1.784728 -0.200416  1.873692  2.097818  0.575256
    

    (McKinney,用于数据分析的 Python,第 186 页)

    编辑:

    糟糕,我注意到您在两个数据框中都有一个 Info 列。我认为在这种情况下这会更好:

    df1.combine_first(df2)
    

    您可以将其视为使用您传递的对象中的数据“修补”调用对象中缺失的数据 (McKinney)

    编辑:

    麦金尼的另一句话,p177 提供

    pandas.merge 基于一个或多个键连接 DataFrame 的行 [如数据库连接]

    pandas.concat 沿轴将对象粘合或堆叠在一起

    combine_first 允许将重叠数据拼接在一起,以用另一个对象中的值填充一个对象中的缺失值

    【讨论】:

    • 哦,所以在这种情况下,“修补”是从 df2 获取信息并填充 df1 中的空格,同时仍然保留 df2 中的不同列和行?
    • 太棒了!真的那么简单吗?我在任何地方都没有看到过这个“df1.combine_first()”,我只见过.merge、.join 和.concat 的条件,例如by=outer 或其他一些对我没有意义的复杂事物新手自己。我很感激。它是numpy的一部分吗?因为这可能是我以前没见过的原因。这也适用于较大的表,对吗?
    • 很多pandas的东西都是根据numpy特性设计的。因此 combine_first() 方法可用于 numpy 系列以及 pandas DataFrame。我在上面导入 numpy 的唯一原因是快速创建一些随机数据帧。我将从 McKinney 的文本中添加一个编辑,它解释了组合和合并的选项。很高兴这有帮助。
    【解决方案2】:
     cols_to_use = df2.columns.difference(df1.columns) # removes all duplicates
     cols_to_use=cols_to_use.union(['Genus']) #since we need Genus for joining df's keep that one
    
     df3=pd.merge(df1,df2[cols_to_use],on='Genus')
    

    输出

          Genus  Info  Stats  Data  Facts
    0       Dog   2.0    3.0   1.0    2.0
    1       Cat   1.0    2.0   3.0    1.0
    2  Elephant   NaN    1.0   NaN    3.0
    3       Pig   NaN    NaN   NaN    NaN
    4     Mouse   NaN    NaN   NaN    NaN
    

    【讨论】:

    • 我不想在我的最终产品中出现重复的列,但谢谢。
    • 删除了重复的列
    • 很有趣,但我假设这需要手动输入每个列标题?这将需要很长时间,因为在某些情况下我的文件有超过 70 列。非常感谢您的宝贵时间!这可能适用于我拥有的其他一些较小的:)
    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2015-12-06
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2021-04-28
    相关资源
    最近更新 更多