合并pandas数据框,无需按特定顺序排列

2024-07-05 10:40:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据文件,它们被转换成数据帧,这些数据帧有时共享列名,而其他数据帧则共享时间序列索引,每当匹配时,我都希望将它们合并为一个基于列和索引的数据帧。由于命名中没有序列,因此它们随机出现以进行串联。如果两个dataframe具有不同的列,并沿着axis=1连接起来,那么它工作得很好,但是如果结果dataframe与新的df结合起来,并带有先前合并的dataframe之一的列名,那么它就无法连接。例如,对于这些数据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。在我的例子中,没有办法首先加载所有数据帧并检查它们的列名。这样我就可以将所有具有相同列名的df组合到后面的concat这些具有不同列名的数据帧,我知道这些数据帧的工作原理如下所示。然而,在我的例子中,要求预加载所有数据帧并重新排列连接序列的解决方案是不可能的(这只是针对上面的一个工作示例)。我需要一个灵活性,在任何序列的信息来它可以连接到更大的数据帧data1。如果你有合适的建议,请告诉我。你知道吗


Tags: csv数据truedataframereadindexparse序列
1条回答
网友
1楼 · 发布于 2024-07-05 10:40:24

如果您一步一步地遍历循环,您会发现在第一次迭代中它进入if,因此data1等于df1。在第二次迭代中,它转到else,因为data1不是空的,''Temperature product barrel ValueY''不在data1.columns。 在else之后,data1有一些重复的列名。在重复列名的每一行中。(两列中的一列是Nan,另一列是float)。这就是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)

相关问题 更多 >