1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】ValueError: 値の長さがインデックスの長さと一致しない|Pandas DataFrame.unique()

2022-01-12 11:32:16

質問

最近、新しいデータセットを実装したり、現在のデータセットのカラムの値を一意の値に変更したりする必要がありました。たとえば、次のような場合です。

   A B
 -----
0| 1 1
1| 2 5
2| 1 5
3| 7 9
4| 7 9
5| 8 9

Wanted Result    Not Wanted Result
       A B            A B
     -----          -----
    0| 1 1         0| 1 1
    1| 2 5         1| 2 5
    2| 7 9         2| 
    3| 8           3| 7 9
                   4|
                   5| 8

新しいdataFrameを使用する方法と使用しない方法の2つを試してみました。

#With New DataFrame
 def UniqueResults(dataframe):
    df = pd.DataFrame()
    for col in dataframe:
        S=pd.Series(dataframe[col].unique())
        df[col]=S.values
    return df

#Without new DataFrame
def UniqueResults(dataframe):
    for col in dataframe:
        dataframe[col]=dataframe[col].unique()
    return dataframe

エラーが発生しました

Length of Values does not match length of index

解決方法は?

データフレームに長さの異なるnumpy配列のリストを代入しようとしているときに出るエラーで、以下のように再現できます。

4行のデータフレームです。

df = pd.DataFrame({'A': [1,2,3,4]})

今度は、2つの要素からなるリスト/配列を割り当てようとしています。

df['B'] = [3,4]   # or df['B'] = np.array([3,4])

両方ともエラーアウト。

ValueError: 値の長さがインデックスの長さと一致しない

データフレームには4つの行がありますが、リストと配列には2つの要素しかないためです。

回避策 (use with caution): リスト/配列をpandasのSeriesに変換し、代入する際にSeriesの欠落したインデックスに NaN :

df['B'] = pd.Series([3,4])

df
#   A     B
#0  1   3.0
#1  2   4.0
#2  3   NaN          # NaN because the value at index 2 and 3 doesn't exist in the Series
#3  4   NaN


もし、インデックスやカラム間の値の対応を気にしないのであれば、重複を削除した後、各カラムのインデックスをリセットすることができます。

df.apply(lambda col: col.drop_duplicates().reset_index(drop=True))

#   A     B
#0  1   1.0
#1  2   5.0
#2  7   9.0
#3  8   NaN