web-dev-qa-db-ja.com

Python pandasリストをセルに挿入

リスト「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]

'abc'リストをdf2.loc[1,'B']および/または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

73
ragesz

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

35
ragesz

set_valueはバージョン0.21.0以降 非推奨 であるため、 at を使用する必要があります。 ValueErrorのようにlocを上げることなく、リストをセルに挿入できます。これは、atalwaysが単一の値を参照するのに対し、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
79
Michael Hays

v0.23 +、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.

これは、オブジェクトがfloat64 dtypeであるのに対し、リストは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]

これが機能する理由について詳しく読むことができます こちら

16
cs95

この投稿で述べたように pandas:データフレームにリストを保存する方法? ;データフレーム内のget dtypesは、結果に影響を与えたり、データフレームを呼び出したり、割り当てられない場合があります。

2
Ando Jurai

簡単な回避策

下のデータフレームの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
Pallavi Jindal