【问题标题】:Joining Multiple Dataframes with Pandas with overlapping Column Names?将具有重叠列名的 Pandas 加入多个数据框?
【发布时间】:2012-10-11 19:27:10
【问题描述】:

我有多个(超过 2 个)要合并的数据框。它们都共享相同的值列:

In [431]: [x.head() for x in data]
Out[431]: 
[                     AvgStatisticData
DateTime                             
2012-10-14 14:00:00         39.335996
2012-10-14 15:00:00         40.210110
2012-10-14 16:00:00         48.282816
2012-10-14 17:00:00         40.593039
2012-10-14 18:00:00         40.952014,
                      AvgStatisticData
DateTime                             
2012-10-14 14:00:00         47.854712
2012-10-14 15:00:00         55.041512
2012-10-14 16:00:00         55.488026
2012-10-14 17:00:00         51.688483
2012-10-14 18:00:00         57.916672,
                      AvgStatisticData
DateTime                             
2012-10-14 14:00:00         54.171233
2012-10-14 15:00:00         48.718387
2012-10-14 16:00:00         59.978616
2012-10-14 17:00:00         50.984514
2012-10-14 18:00:00         54.924745,
                      AvgStatisticData
DateTime                             
2012-10-14 14:00:00         65.813114
2012-10-14 15:00:00         71.397868
2012-10-14 16:00:00         76.213973
2012-10-14 17:00:00         72.729002
2012-10-14 18:00:00         73.196415,
....etc

我读到 join 可以处理多个数据帧,但是我得到:

In [432]: data[0].join(data[1:])
...
Exception: Indexes have overlapping values: ['AvgStatisticData']

我尝试通过rsuffix=["%i" % (i) for i in range(len(data))] 加入,但仍然遇到同样的错误。我可以通过以列名不重叠的方式构建我的data 列表来解决此问题,但也许有更好的方法?

【问题讨论】:

    标签: join merge pandas


    【解决方案1】:

    我会尝试pandas.merge 使用suffixes= 选项。

    import pandas as pd
    import datetime as dt
    
    df_1 = pd.DataFrame({'x' : [dt.datetime(2012,10,21) + dt.timedelta(n) for n in range(10)], 'y' : range(10)})
    df_2 = pd.DataFrame({'x' : [dt.datetime(2012,10,21) + dt.timedelta(n) for n in range(10)], 'y' : range(10)})
    df = pd.merge(df_1, df_2, on='x', suffixes=['_1', '_2'])
    

    我有兴趣看看专家是否有更算法的方法来合并数据框列表。

    【讨论】:

    • 期望的结果是在 DateTime 索引上加入的行,例如第一行是(用逗号分隔列):2012-10-14 14:00:00, 39.335996, 47.8854712, 54.171233 ...etc
    • 好吧,我有点慢:)。我会尝试pandas.merge 而不是join。 @KyleBrandt,这应该可以让您度过一夜,但如果专业人士有更清洁的解决方案,我很感兴趣。
    • 问题是多于2个
    • 当然,这是非常手动的。 pandas.concat() 解决方案好多 更好——我认为concataxis=1 时给出了重复的列名错误,但我还有很多东西要学。 :)
    【解决方案2】:
    In [65]: pd.concat(data, axis=1)
    Out[65]:
                         AvgStatisticData  AvgStatisticData  AvgStatisticData  AvgStatisticData
    2012-10-14 14:00:00         39.335996         47.854712         54.171233         65.813114
    2012-10-14 15:00:00         40.210110         55.041512         48.718387         71.397868
    2012-10-14 16:00:00         48.282816         55.488026         59.978616         76.213973
    2012-10-14 17:00:00         40.593039         51.688483         50.984514         72.729002
    2012-10-14 18:00:00         40.952014         57.916672         54.924745         73.196415
    

    【讨论】:

    • 如果索引只是部分重叠怎么办?
    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 2017-08-23
    • 2022-01-06
    • 2019-12-06
    • 2016-04-12
    • 2020-11-06
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多