pandas concat「InvalidIndexError:一意に評価されたインデックスオブジェクトでのみ有効なインデックスの再作成」

パンダconcatメソッドを使用してすぐに非常に便利である、複数のデータフレームをスタックすることができますが、連結を使用した場合
、プロンプト『pandas.errors.InvalidIndexError:一意大切インデックスでのみ有効なのインデックスの再作成すると、オブジェクトの表示されます翻訳です:ペアに使用パンダdfが連結操作を実行する場合、対応する行と列のインデックスは一意である必要がありますしかし、例外があります。それは何ですか?ゆっくり話させてください。

まず、デモンストレーション用にいくつかのdfを作成します。

まず、次のコードに示すように、df1とdf2が垂直方向と水平方向にスプライスされます。列インデックスと行インデックスの名前が同じではないという前提の下で、concatは正常に実行されることがわかりました。

以下に、同じ列インデックスのdf3とdf1間の連結スプライシング操作を紹介します。df3の列インデックスabcabのab列が重複しているため、df3をdf1と連結スタックすることはできません。

以下では、連結スプライシング操作でdf3とdf4の同じ列インデックスを紹介します。df3とdf4の列インデックスabcabのab列は重複していますが、df3とdf4の列インデックスは同じであるため、concatも正常に実行できます。これは例外です。

では、重複する行と列のインデックスdfを連結する方法は?あれは:

重複を削除するには、行インデックスが重複している場合、これら2つのdfに対してdf.reset_index()を実行します。

列インデックスが重複している場合は、df.rename(columns = "xxxx"、inplace = True)を使用して列インデックスの名前を変更します

import pandas as pd
import numpy as np

df1=pd.DataFrame(np.random.randint(0,5,(6,5)),columns=list("abcde"))

df3=pd.DataFrame(np.random.randint(-10,0,(3,5)),columns=list("abcab"))

#df1=df1.reset_index()
#df3=df3.reset_index()

data3.columns = [j + f'_{i}' if data.columns.duplicated()[i] else j for i,j in enumerate(data.columns)]

df_c13=pd.concat([df1,df3],keys=["df1","df3"])
print(df_c13)

最後に、2つのdfの列名が完全に同じである場合、dfの行と列に重複する列インデックスが含まれている場合でも、垂直方向のスタック操作を連結できます。

 

おすすめ

転載: blog.csdn.net/xcntime/article/details/115180924