Pythonパンダはセルにリストを挿入します


105

私はリスト「abc」とデータフレーム「df」を持っています:

abc = ['foo', 'bar']
df =
    A  B
0  12  NaN
1  23  NaN

リストをセル1Bに挿入したいので、次の結果が必要です。

    A  B
0  12  NaN
1  23  ['foo', 'bar']

どうすればいいですか?

1)これを使用する場合:

df.ix[1,'B'] = abc

次のエラーメッセージが表示されます。

ValueError: Must have equal len keys and value when setting with an iterable

これは、リスト(2つの要素を持つ)を行/列に挿入しようとしますが、セルには挿入しないためです。

2)これを使用する場合:

df.ix[1,'B'] = [abc]

次に、 'abc'リスト([['foo', 'bar']])である要素が1つだけのリストを挿入します。

3)これを使用する場合:

df.ix[1,'B'] = ', '.join(abc)

次に、文字列を挿入します:(foo, bar)がリストではありません。

4)これを使用する場合:

df.ix[1,'B'] = [', '.join(abc)]

次に、リストを挿入しますが、要素は1つしかあり['foo, bar']ませんが()、必要に応じて2つはありません(['foo', 'bar'])。

手伝ってくれてありがとう!


編集

私の新しいデータフレームと古いリスト:

abc = ['foo', 'bar']
df2 =
    A    B         C
0  12  NaN      'bla'
1  23  NaN  'bla bla'

別のデータフレーム:

df3 =
    A    B         C                    D
0  12  NaN      'bla'  ['item1', 'item2']
1  23  NaN  'bla bla'        [11, 12, 13]

df2.loc[1,'B']および/に「abc」リストを挿入したいdf3.loc[1,'B']

データフレームに整数値および/またはNaN値および/またはリスト値のみの列がある場合、セルへのリストの挿入は完全に機能します。データフレームに文字列値および/またはNaN値および/またはリスト値のみを含む列がある場合、セルへのリストの挿入は完全に機能します。しかし、データフレームに整数値と文字列値を持つ列と他の列がある場合、これを使用するとエラーメッセージが表示されます:df2.loc[1,'B'] = abcまたはdf3.loc[1,'B'] = abc

別のデータフレーム:

df4 =
          A     B
0      'bla'  NaN
1  'bla bla'  NaN

これらのインサートは完全に機能します:df.loc[1,'B'] = abcまたはdf4.loc[1,'B'] = abc


1
どのバージョンのパンダを使用していますか?以下はパンダを使用して動作しました0.15.0df.loc[1,'b'] = ['foo','bar']
EdChum 2014年

ありがとうございました!私はPython 2.7を使用し、パンダ0.14.0と0.15.0を試しましたが、上記のテストデータで動作しました。しかし、「C」列といくつかの整数値がある場合はどうなりますか?「A」には文字列があります。ValueError:整数列と私は同じエラーを取得srting列を持つ必要があり反復可能で設定するときに等しいlenのキーと値を持っている
ragesz

意味を説明して示すために、データとコードを投稿する必要があります
EdChum

回答:


118

set_valueはバージョン0.21.0 から非推奨になっているため、を使用する必要がありますatValueErroras を呼び出さずにセルにリストを挿入できlocます。これは、at 常に単一の値locを参照する一方で、行や列だけでなく値も参照できるためだと思います。

df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})

df.at[1, 'B'] = ['m', 'n']

df =
    A   B
0   1   x
1   2   [m, n]
2   3   z

また、挿入するにがあることを確認する必要もありますdtype=object。例えば

>>> df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [1,2,3]})
>>> df.dtypes
A    int64
B    int64
dtype: object

>>> df.at[1, 'B'] = [1, 2, 3]
ValueError: setting an array element with a sequence

>>> df['B'] = df['B'].astype('object')
>>> df.at[1, 'B'] = [1, 2, 3]
>>> df
   A          B
0  1          1
1  2  [1, 2, 3]
2  3          3

3
私は仕事に、このために必ずオリジナルのデータフレームDTYPEがオブジェクトに設定されたしなければならなかった:df = pd.DataFrame(data, dtype=object)
Takver

2
atにはインデックスが必要です。別の属性値の一致を使用して行を参照するにはどうすればよいですか。例:上記の例でA = 2の行の場合?
bikashg

8
これは別のエラーを返しますValueError: setting an array element with a sequence.。エラーが発生した場合は、@ cs95の回答を参照してください。
Blaszard

39

df3.set_value(1, 'B', abc)任意のデータフレームで機能します。列 'B'のデータ型に注意してください。例えば。リストはfloat列に挿入できませんdf['B'] = df['B'].astype(object)。その場合は役立ちます。


6
このコマンドは廃止ていることに注意してください。すぐ下にアップデートがあります。
トーマス

35

パンダ> = 0.21

set_value廃止されました。 を使用DataFrame.atしてラベルでDataFrame.iat設定したり、整数位置で設定したりできるようになりました。

at/によるセル値の設定iat

# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df

    A       B
0  12  [a, b]
1  23  [c, d]

df.dtypes

A     int64
B    object
dtype: object

「B」の2行目の値を新しいリストに設定する場合は、次のコマンドを使用しますDataFrane.at

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

整数位置で設定することもできます DataFrame.iat

df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

もしもらったらValueError: setting an array element with a sequence

私はこれを再現しようとします:

df

    A   B
0  12 NaN
1  23 NaN

df.dtypes

A      int64
B    float64
dtype: object

df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.

これは、オブジェクトがfloat64dtypeであるのに対し、リストはobjectsであるため、不一致があります。この状況では、最初に列をオブジェクトに変換する必要があります。

df['B'] = df['B'].astype(object)
df.dtypes

A     int64
B    object
dtype: object

次に、それは動作します:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12     NaN
1  23  [m, n]

可能、でもハッキー

さらに奇妙なことに、DataFrame.locネストされたリストを渡すと、ハックして同様のことを実現できることがわかりました。

df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df

    A             B
0  12        [a, b]
1  23  [m, n, o, p]

これが機能する理由については、こちらをご覧ください。



2

迅速な回避策

以下のデータフレームのcol2の場合と同様に、リストを新しいリストで囲むだけです。これが機能する理由は、Pythonが(リストの)外部リストを取得して、通常のスカラーアイテム(通常のスカラーではなくリスト)を含むかのように列に変換するためです。

mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data


   col1     col2
0   1       [1, 4]
1   2       [2, 5]
2   3       [3, 6]

0

また取得

ValueError: Must have equal len keys and value when setting with an iterable

私の場合、.locではなく.atを使用しても違いはありませんでしたが、データフレーム列のデータ型を強制するとうまくいきました。

df['B'] = df['B'].astype(object)

次に、リスト、numpy配列、およびあらゆる種類のものをデータフレームの単一のセル値として設定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.