在panda中,我试图连接一组数据帧,但我得到了以下错误:
ValueError: Plan shapes are not aligned
我对.concat()
的理解是,它会在列相同的地方连接,但对于那些找不到的列,它会用NA填充。这里似乎不是这样。
以下是concat声明:
dfs = [npo_jun_df, npo_jul_df,npo_may_df,npo_apr_df,npo_feb_df]
alpha = pd.concat(dfs)
如果有帮助的话,我在尝试连接两个数据帧时也遇到了这个错误(截至撰写本文时,这是我在谷歌上除了源代码之外唯一能找到的相关错误)。
我不知道这个答案是否能解决OP的问题(因为他/她没有发布足够的信息),但对我来说,这是当我尝试用列['A', 'B', 'B', 'C']
的concat
数据帧df1
(请参阅重复的列标题?)和列['A', 'B']
的df2
数据帧时造成的。可以理解的是,这种重复导致熊猫摇晃。将df1
更改为['A', 'B', 'C']
(即删除其中一个重复列),一切正常。
我最近也收到了这条消息,我发现像上面的用户@jason和@user3805082一样,我试图concat
的数百个数据帧中有几个数据帧有重复的列,每个数据帧都有几十个神秘的varname。手动搜索重复项是不可行的。
如果其他人也有同样的问题,我编写了以下函数,可能会有所帮助。
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进行迭代,以报告有多少重复项,删除重复的变量,或者以某种系统的方式重命名它们。
编写一个小函数来连接重复的列名。函数关心排序。如果原始数据帧未排序,则输出将是排序的。
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
您需要为所有要连接的df使用相同的头名称。
举个例子:
headername=列表(df)
Data=Data.filter(headername)
如何从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
错误解释
如果第一个pandas数据帧(此处为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
Pandas concat
本可以对该错误消息更有帮助。这是一个直接的bubbleup实现itis,它是教科书中的python。
我收到ValueError:在一起添加数据帧时,平面形状不对齐。我试着在Excel表格上循环,清洗后将它们连接在一起。
错误被提出,因为它们是多个none列,我用下面的代码删除了这些列:
df=df.loc[:,df.columns.notnull()]#在stackoverflow 上找到
错误是因为有重复的列。使用以下函数可以在不影响数据的情况下删除重复的函数。
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