Concat pandas数据帧没有遵循某个序列

时间:2017-11-21 10:16:16

标签: python python-3.x pandas dataframe

我有数据文件转换为pandas数据帧,有时会共享列名,而其他人共享时间序列索引,我希望在匹配时根据列和索引将这些数据组合成一个数据帧。由于命名中没有序列,因此它们随机出现以进行连接。如果两个数据帧具有不同的列,并且axis=1连接在一起,则效果很好,但是如果结果数据帧与新df组合,并且其中一个早期合并的pandas数据帧的列名称,则无法连接。例如,使用这些数据files

import pandas as pd

df1 = pd.read_csv('0.csv', index_col=0, parse_dates=True, infer_datetime_format=True)
df2 = pd.read_csv('1.csv', index_col=0, parse_dates=True, infer_datetime_format=True)
df3 = pd.read_csv('2.csv', index_col=0, parse_dates=True, infer_datetime_format=True)

data1 = pd.DataFrame()
file_list = [df1, df2, df3]  # fails
# file_list = [df2, df3,df1]   # works
for fn in file_list:
   if data1.empty==True or fn.columns[1] in data1.columns:
        data1 = pd.concat([data1,fn])
   else:
        data1 = pd.concat([data1,fn], axis=1)

当我尝试这样做时,我得到ValueError: Plan shapes are not aligned。在我的情况下,无法首先加载所有DataFrame并检查其列名。我可以将所有df与相同的列名称合并到以后仅concat这些结果数据框,这些数据框在axis=1上具有不同的列名,我知道它们的工作原理如下所示。但是,在我的情况下,不需要预加载所有DataFrame并重新排列连接序列的解决方案(仅针对上面的工作示例)。无论信息来自哪个序列,我都需要灵活性,它可以与更大的数据帧data1连接。如果您有合适的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

如果您逐步完成循环,您会发现在第一次迭代中它进入if,因此data1等于df1。在第二次迭代中,它转到else,因为data1不为空且''Temperature product barrel ValueY''不在data1.columns中。 在else之后,data1有一些重复的列名。在重复列名称的每一行中。 (2列中的一列是Nan,另一列是浮点数)。这就是pd.concat()失败的原因。

您可以在尝试连接之前聚合重复的列以清除它:

for fn in file_list:
    if data1.empty==True or fn.columns[1] in data1.columns:
        # new: 
        data1 = data1.groupby(data1.columns, axis=1).agg(np.nansum)
        data1 = pd.concat([data1,fn])
    else:
        data1 = pd.concat([data1,fn], axis=1)

之后,你会得到

data1.shape
(30, 23)