Saya memiliki daftar 'abc' dan dataframe 'df':
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Saya ingin memasukkan daftar ke sel 1B, jadi saya ingin hasil ini:
A B
0 12 NaN
1 23 ['foo', 'bar']
Ho bisakah saya melakukan itu?
1) Jika saya menggunakan ini:
df.ix[1,'B'] = abc
Saya mendapatkan pesan kesalahan berikut:
ValueError: Must have equal len keys and value when setting with an iterable
karena mencoba memasukkan daftar (yang memiliki dua elemen) ke dalam baris / kolom tetapi tidak ke dalam sel.
2) Jika saya menggunakan ini:
df.ix[1,'B'] = [abc]
kemudian menyisipkan daftar yang hanya memiliki satu elemen yaitu 'abc' list ( [['foo', 'bar']]
).
3) Jika saya menggunakan ini:
df.ix[1,'B'] = ', '.join(abc)
lalu menyisipkan string: ( foo, bar
) tetapi bukan daftar.
4) Jika saya menggunakan ini:
df.ix[1,'B'] = [', '.join(abc)]
lalu itu menyisipkan daftar tetapi hanya memiliki satu elemen ( ['foo, bar']
) tetapi tidak dua seperti yang saya inginkan ( ['foo', 'bar']
).
Terimakasih atas bantuannya!
EDIT
Dataframe baru saya dan daftar lama:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Dataframe lain:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
Saya ingin memasukkan daftar 'abc' ke df2.loc[1,'B']
dan / atau df3.loc[1,'B']
.
Jika kerangka data memiliki kolom hanya dengan nilai integer dan / atau nilai NaN dan / atau nilai daftar, maka memasukkan daftar ke dalam sel bekerja dengan sempurna. Jika kerangka data memiliki kolom hanya dengan nilai string dan / atau nilai NaN dan / atau nilai daftar, maka memasukkan daftar ke dalam sel bekerja dengan sempurna. Tetapi jika dataframe memiliki kolom dengan nilai integer dan string dan kolom lainnya maka muncul pesan kesalahan jika saya menggunakan ini: df2.loc[1,'B'] = abc
atau df3.loc[1,'B'] = abc
.
Dataframe lain:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Sisipan ini bekerja dengan sempurna: df.loc[1,'B'] = abc
atau df4.loc[1,'B'] = abc
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Jawaban:
Karena
set_value
sudah tidak digunakan lagi sejak versi 0.21.0, sekarang Anda harus menggunakanat
. Itu dapat memasukkan daftar ke dalam sel tanpa meningkatkanValueError
seperti yangloc
dilakukannya. Saya rasa ini karenaat
selalu mengacu pada satu nilai, sementaraloc
dapat merujuk pada nilai serta baris dan kolom.Anda juga perlu memastikan kolom yang Anda masukkan memiliki
dtype=object
. Sebagai contohsumber
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
; lihat jawaban oleh @ cs95 jika Anda mendapatkan kesalahan.df3.set_value(1, 'B', abc)
berfungsi untuk kerangka data apa pun. Jaga tipe data kolom 'B'. Misalnya. daftar tidak dapat dimasukkan ke dalam kolom float, dalam hal inidf['B'] = df['B'].astype(object)
dapat membantu.sumber
Panda> = 0,21
set_value
sudah tidak digunakan lagi. Anda sekarang dapat menggunakanDataFrame.at
to set by label, danDataFrame.iat
to set by integer position.Mengatur Nilai Sel dengan
at
/iat
Jika Anda ingin menetapkan nilai di baris kedua "B" ke beberapa daftar baru, gunakan
DataFrane.at
:Anda juga dapat mengatur dengan posisi integer menggunakan
DataFrame.iat
Bagaimana jika saya mendapatkan
ValueError: setting an array element with a sequence
?Saya akan mencoba mereproduksi ini dengan:
Ini karena objek Anda
float64
berjenis d, sedangkan daftar adalahobject
s, jadi ada ketidakcocokan di sana. Apa yang harus Anda lakukan dalam situasi ini adalah mengonversi kolom menjadi objek terlebih dahulu.Kemudian, ini berhasil:
Mungkin, Tapi Hacky
Yang lebih aneh lagi, saya menemukan Anda dapat meretas
DataFrame.loc
untuk mencapai sesuatu yang serupa jika Anda melewati daftar bersarang.Anda dapat membaca lebih lanjut tentang mengapa ini berfungsi di sini.
sumber
Seperti disebutkan dalam pandas posting ini : bagaimana cara menyimpan daftar di dataframe? ; dtypes dalam kerangka data dapat memengaruhi hasil, serta memanggil kerangka data atau tidak untuk ditugaskan.
sumber
Bekerja cepat
Cukup lampirkan daftar di dalam daftar baru, seperti yang dilakukan untuk col2 dalam bingkai data di bawah ini. Alasan kerjanya adalah karena python mengambil daftar terluar (dari daftar) dan mengubahnya menjadi kolom seolah-olah itu berisi item skalar normal, yang merupakan daftar dalam kasus kami dan bukan skalar normal.
sumber
Juga mendapatkan
ValueError: Must have equal len keys and value when setting with an iterable
,menggunakan .at daripada .loc tidak membuat perbedaan apa pun dalam kasus saya, tetapi memaksakan tipe data kolom dataframe melakukan trik:
Kemudian saya bisa mengatur daftar, array numpy dan segala macam hal sebagai nilai sel tunggal dalam kerangka data saya.
sumber