1. ホーム
  2. データベース
  3. マイサク

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

2021-12-30 17:23:09

質問

新しいデータセットを取得したり、現在のデータセットのカラムの値を一意の値に変更しようとしています。以下は、私が取得しようとしているものの例です。

   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

実行すると、エラーが発生します。

ValueError: 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