web-dev-qa-db-ja.com

Pandas concatはValueErrorを生成します:プランの形状が整列していません

私はパンダにはかなり新しいです、私は一連のデータフレームを連結しようとしていますが、このエラーが発生しています:

_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)
_
37
Lt.Fr0st

それが役立つ場合、2つのデータフレームを連結しようとしたときにこのエラーが発生しました(これを書いている時点では、これはソースコード以外にGoogleで見つけることができる唯一の関連するヒットです)。

この答えがOPの問題を解決したかどうかはわかりません(彼/彼女は十分な情報を投稿していなかったため)が、私にとっては、concatデータフレームdf1列あり['A', 'B', 'B', 'C'](列見出しの重複を参照してください?)with dataframe df2列あり['A', 'B']。当然のことながら、重複によりpandasがぐらつくようになりました。変更df1から['A', 'B', 'C'](つまり、重複する列の1つをドロップする)とすべてが正常に動作します。

75
user3805082

私も最近このメッセージを受け取りましたが、ユーザー @ 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

次に、そのディクテーションを反復して、重複の数を報告したり、重複した変数を削除したり、体系的な方法で名前を変更したりできます。

6
William Welsh

重複した列名を連結する小さな関数を作成しました。元のデータフレームが並べ替えられていない場合、関数は並べ替えを考慮し、出力は並べ替えられます。

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
2
DiMithras