リスト「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
。
df3.set_value(1, 'B', abc)
はどのデータフレームでも機能します。列「B」のデータ型に注意してください。例えば。リストをフロート列に挿入することはできません。その場合、df['B'] = df['B'].astype(object)
が役立ちます。
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であるのに対し、リストはobject
sであるため、そこに不一致があります。この状況で行う必要があるのは、最初に列をオブジェクトに変換することです。
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]
これが機能する理由について詳しく読むことができます こちら
この投稿で述べたように pandas:データフレームにリストを保存する方法? ;データフレーム内のget dtypesは、結果に影響を与えたり、データフレームを呼び出したり、割り当てられない場合があります。
簡単な回避策
下のデータフレームの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]