私はパンダにはかなり新しいです、私は一連のデータフレームを連結しようとしていますが、このエラーが発生しています:
_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)
_
それが役立つ場合、2つのデータフレームを連結しようとしたときにこのエラーが発生しました(これを書いている時点では、これはソースコード以外にGoogleで見つけることができる唯一の関連するヒットです)。
この答えがOPの問題を解決したかどうかはわかりません(彼/彼女は十分な情報を投稿していなかったため)が、私にとっては、concat
データフレームdf1
列あり['A', 'B', 'B', 'C']
(列見出しの重複を参照してください?)with dataframe df2
列あり['A', 'B']
。当然のことながら、重複によりpandasがぐらつくようになりました。変更df1
から['A', 'B', 'C']
(つまり、重複する列の1つをドロップする)とすべてが正常に動作します。
私も最近このメッセージを受け取りましたが、ユーザー @ 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
次に、そのディクテーションを反復して、重複の数を報告したり、重複した変数を削除したり、体系的な方法で名前を変更したりできます。
重複した列名を連結する小さな関数を作成しました。元のデータフレームが並べ替えられていない場合、関数は並べ替えを考慮し、出力は並べ替えられます。
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