将具有重叠列名的 Pandas 加入多个数据框?
Posted
技术标签:
【中文标题】将具有重叠列名的 Pandas 加入多个数据框?【英文标题】:Joining Multiple Dataframes with Pandas with overlapping Column Names? 【发布时间】: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
列表来解决此问题,但也许有更好的方法?
【问题讨论】:
【参考方案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()
解决方案好多 更好——我认为concat
在axis=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
【讨论】:
如果索引只是部分重叠怎么办?以上是关于将具有重叠列名的 Pandas 加入多个数据框?的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas - 具有不同列的 Concat 数据框忽略列名