我有数据文件转换为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
连接。如果您有合适的方法,请告诉我。
答案 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)