Pandas concat给出错误ValueError:计划形状未对齐

时间:2014-10-06 23:21:31

标签: python pandas concat

我对熊猫很新,我试图连接一组数据帧,我收到了这个错误:

ValueError: Plan shapes are not aligned

我对.concat()的理解是它会在列相同的地方加入,但对于那些找不到它的人来说,它会填充NA。这似乎不是这种情况。

继承人的声明:

dfs = [npo_jun_df, npo_jul_df,npo_may_df,npo_apr_df,npo_feb_df]
alpha = pd.concat(dfs)

8 个答案:

答案 0 :(得分:66)

如果它有帮助,我在尝试连接两个数据帧时也遇到了这个错误(截至撰写本文时,这是我可以在google上找到的唯一相关命中,而不是源代码)。

我不知道这个答案是否会解决OP的问题(因为他/她没有发布足够的信息),但对我来说,这是因为我试图{ {1}}数据框concat包含df1列(请参见重复的列标题?),数据框['A', 'B', 'B', 'C']的列为df2。可以理解的是,重复导致大熊猫晃动。将['A', 'B']更改为df1(即删除其中一个重复的列),一切正常。

答案 1 :(得分:2)

我最近也收到了这条消息,我发现上面的用户@jason@user3805082我在我试图concat的数百个数据帧中有几个重复的列,每个都有几十个神秘的变种。手动搜索重复项是不切实际的。

如果其他人有同样的问题,我写了以下功能,可能会有所帮助。

def duplicated_varnames(df):
    """Return a dict of all variable names that 
    are duplicated in a given dataframe."""
    repeat_dict = {}
    var_list = list(df) # list of varnames as strings
    for varname in var_list:
        # make a list of all instances of that varname
        test_list = [v for v in var_list if v == varname] 
        # if more than one instance, report duplications in repeat_dict
        if len(test_list) > 1: 
            repeat_dict[varname] = len(test_list)
    return repeat_dict

然后你可以迭代那个dict来报告有多少重复,删除重复的变量,或者以某种系统的方式重命名它们。

答案 2 :(得分:1)

写了一个小函数来连接重复的列名。 如果原始数据帧未排序,函数关心排序,输出将是排序的。

def concat_duplicate_columns(df):
    dupli = {}
    # populate dictionary with column names and count for duplicates 
    for column in df.columns:
        dupli[column] = dupli[column] + 1 if column in dupli.keys() else 1
    # rename duplicated keys with °°° number suffix
    for key, val in dict(dupli).items():
        del dupli[key]
        if val > 1:
            for i in range(val):
                dupli[key+'°°°'+str(i)] = val
        else: dupli[key] = 1
    # rename columns so that we can now access abmigous column names
    # sorting in dict is the same as in original table
    df.columns = dupli.keys()
    # for each duplicated column name
    for i in set(re.sub('°°°(.*)','',j) for j in dupli.keys() if '°°°' in j):
        i = str(i)
        # for each duplicate of a column name
        for k in range(dupli[i+'°°°0']-1):
            # concatenate values in duplicated columns
            df[i+'°°°0'] = df[i+'°°°0'].astype(str) + df[i+'°°°'+str(k+1)].astype(str)
            # Drop duplicated columns from which we have aquired data
            df = df.drop(i+'°°°'+str(k+1), 1)
    # resort column names for proper mapping
    df = df.reindex_axis(sorted(df.columns), axis = 1)
    # rename columns
    df.columns = sorted(set(re.sub('°°°(.*)','',i) for i in dupli.keys()))
    return df

答案 3 :(得分:0)

pip install pandas --upgrade为我解决了这个问题。

答案 4 :(得分:0)

要连接的所有df文件都必须具有相同的标头名称。

例如使用:

headername = list(df)

Data = Data.filter(headername)

答案 5 :(得分:0)

如何从pandas.concat(...)重现以上错误:

ValueError:平面形状未对齐

Python(3.6.8)代码:

import pandas as pd
df = pd.DataFrame({"foo": [3] })
print(df)
df2 = pd.concat([df, df], axis="columns")
print(df2)
df3 = pd.concat([df2, df], sort=False) #ValueError: Plan shapes are not aligned

打印:

   foo
0    3

   foo  foo
0    3    3
ValueError: Plan shapes are not aligned

错误说明

如果第一个熊猫数据框(此处为df2)具有重复的命名列并发送到pd.concat,而第二个数据框与第一个数据框的尺寸不同,则会出现此错误

解决方案

确保没有重复的命名列:

df_onefoo = pd.DataFrame({"foo": [3] })
print(df_onefoo)
df_onebar = pd.DataFrame({"bar": [3] })
print(df_onebar)
df2 = pd.concat([df_onefoo, df_onebar], axis="columns")
print(df2)
df3 = pd.concat([df2, df_onefoo], sort=False)
print(df2)

打印:

   foo
0    3

   bar
0    3

   foo  bar
0    3    3

   foo  bar
0    3    3

熊猫concat对于该错误消息可能会更有帮助。这是一个直接的bubbleup-implementation-itis,这是教科书python。

答案 6 :(得分:0)

我收到了 ValueError:将数据帧添加到一起时,平面形状未对齐。我试图遍历 Excel 工作表,并在清理后将它们组合在一起。

错误被引发,因为它们有多个无列,我用下面的代码删除了这些列:

df = df.loc[:, df.columns.notnull()] # 在 stackoverflow 上找到

答案 7 :(得分:-1)

错误是由重复的列引起的。使用以下功能可以删除重复功能而不影响数据。

def duplicated_varnames(df):
    repeat_dict = {}
    var_list = list(df) # list of varnames as strings
    for varname in var_list:
        test_list = [v for v in var_list if v == varname] 
        if len(test_list) > 1: 
            repeat_dict[varname] = len(test_list)
        if len(repeat_dict)>0:
            df = df.loc[:,~df.columns.duplicated()]
    return df