使用Pandas将具有重叠列名的多个数据帧连接起来?

12

我有多个(超过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))]传递给join,但仍然遇到相同的错误。我可以通过以不重叠列名的方式构建data列表来解决此问题,但也许有更好的方法?

2个回答

16
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

3
如果指数只部分重叠,会怎样? - Joseph Garvin

5

我建议使用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'])

我很想看看专家对于合并数据帧列表是否有更加算法化的方法。


期望的结果是在日期时间索引上连接行,例如第一行将是(逗号分隔列):2012-10-14 14:00:00, 39.335996, 47.8854712, 54.171233 ...等等 - Kyle Brandt
1
好的,我有点慢:)。我会尝试使用pandas.merge而不是join。这应该能帮助你度过今晚,@KyleBrandt,但我很想知道专业人士是否有更简洁的解决方案。 - Richard Herron
1
问题在于有超过2个。 - Kyle Brandt
2
当然,这是非常手动的。pandas.concat() 解决方案要好得多——我以为 concataxis=1 时会出现重复列名错误,但我还有很多东西要学习。 :) - Richard Herron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接