Gấu trúc Python chèn danh sách vào một ô


105

Tôi có một danh sách 'abc' và khung dữ liệu 'df':

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

Tôi muốn chèn danh sách vào ô 1B, vì vậy tôi muốn kết quả này:

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

Hồ tôi có thể làm điều đó?

1) Nếu tôi sử dụng cái này:

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

Tôi nhận được thông báo lỗi sau:

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

bởi vì nó cố gắng chèn danh sách (có hai phần tử) vào một hàng / cột nhưng không chèn vào một ô.

2) Nếu tôi sử dụng cái này:

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

thì nó sẽ chèn một danh sách chỉ có một phần tử là danh sách 'abc' ( [['foo', 'bar']]).

3) Nếu tôi sử dụng cái này:

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

thì nó sẽ chèn một chuỗi: ( foo, bar) nhưng không chèn một danh sách.

4) Nếu tôi sử dụng cái này:

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

sau đó nó chèn một danh sách nhưng nó chỉ có một phần tử ( ['foo, bar']) chứ không phải hai phần tử như tôi muốn ( ['foo', 'bar']).

Cảm ơn vì sự giúp đỡ!


BIÊN TẬP

Khung dữ liệu mới của tôi và danh sách cũ:

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

Một khung dữ liệu khác:

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

Tôi muốn chèn danh sách 'abc' vào df2.loc[1,'B']và / hoặc df3.loc[1,'B'].

Nếu khung dữ liệu chỉ có các cột với giá trị nguyên và / hoặc giá trị NaN và / hoặc giá trị danh sách thì việc chèn danh sách vào ô hoạt động hoàn hảo. Nếu khung dữ liệu chỉ có các cột với giá trị chuỗi và / hoặc giá trị NaN và / hoặc giá trị danh sách thì việc chèn danh sách vào ô hoạt động hoàn hảo. Nhưng nếu khung dữ liệu có các cột có giá trị số nguyên và chuỗi và các cột khác thì thông báo lỗi sẽ xuất hiện nếu tôi sử dụng điều này: df2.loc[1,'B'] = abchoặc df3.loc[1,'B'] = abc.

Một khung dữ liệu khác:

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

Những phần chèn này hoạt động hoàn hảo: df.loc[1,'B'] = abchoặc df4.loc[1,'B'] = abc.


1
Bạn đang sử dụng phiên bản gấu trúc nào? sau đây đã làm việc sử dụng gấu trúc 0.15.0:df.loc[1,'b'] = ['foo','bar']
EdChum

Cảm ơn bạn! Tôi sử dụng Python 2.7 và tôi đã thử pandas 0.14.0 và 0.15.0 và nó hoạt động với dữ liệu thử nghiệm ở trên. Nhưng điều gì sẽ xảy ra nếu tôi có cột 'C' với một số giá trị số nguyên? 'A' có các chuỗi. Có một cột số nguyên và một cột srting tôi nhận được lỗi tương tự: ValueError: Phải có phím len bình đẳng và giá trị khi thiết với một iterable
ragesz

Bạn sẽ phải gửi dữ liệu và mã để giải thích và hiển thị những gì bạn có nghĩa là
EdChum

Câu trả lời:


119

set_valueđã không được dùng nữa kể từ phiên bản 0.21.0, bây giờ bạn nên sử dụng at. Nó có thể chèn một danh sách vào một tế bào mà không tăng một ValueErrornhư locvậy. Tôi nghĩ điều này là do at luôn đề cập đến một giá trị duy nhất, trong khi loccó thể đề cập đến các giá trị cũng như các hàng và cột.

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

Bạn cũng cần đảm bảo rằng cột bạn đang chèn vào có dtype=object. Ví dụ

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

4
Tôi phải đảm bảo rằng loại khung dữ liệu ban đầu được đặt thành đối tượng để điều này hoạt động:df = pd.DataFrame(data, dtype=object)
Takver

2
khi cần một chỉ mục. Làm cách nào để tham chiếu đến hàng bằng cách sử dụng một giá trị thuộc tính khớp khác; ví dụ: cho hàng có A = 2 trong ví dụ trên?
bikashg

8
Điều này trả lại một lỗi khác ValueError: setting an array element with a sequence.; xem câu trả lời của @ cs95 nếu bạn gặp lỗi.
Blaszard

39

df3.set_value(1, 'B', abc)hoạt động cho bất kỳ khung dữ liệu nào. Hãy quan tâm đến kiểu dữ liệu của cột 'B'. Ví dụ. một danh sách không thể được chèn vào một cột float, trong trường hợp đó df['B'] = df['B'].astype(object)có thể hữu ích.


6
Lưu ý rằng lệnh này không được dùng nữa . Có một bản cập nhật ngay bên dưới.
Thomas

35

Gấu trúc> = 0,21

set_valueđã không được dùng nữa. Bây giờ bạn có thể sử dụng DataFrame.atđể đặt theo nhãn và DataFrame.iatđặt theo vị trí số nguyên.

Đặt giá trị ô với 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

Nếu bạn muốn đặt giá trị ở hàng thứ hai của "B" thành một số danh sách mới, hãy sử dụng DataFrane.at:

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

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

Bạn cũng có thể đặt theo vị trí số nguyên bằng cách sử dụng DataFrame.iat

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

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

Nếu tôi nhận được ValueError: setting an array element with a sequencethì sao?

Tôi sẽ cố gắng tái tạo điều này bằng:

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.

Điều này là do đối tượng của bạn thuộc loại float64dtype, trong khi danh sách là objects, vì vậy có sự không khớp ở đó. Những gì bạn sẽ phải làm trong tình huống này là chuyển đổi cột thành đối tượng trước.

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

A     int64
B    object
dtype: object

Sau đó, nó hoạt động:

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

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

Có thể, nhưng Hacky

Kỳ lạ hơn nữa, tôi thấy bạn có thể đột nhập DataFrame.locđể đạt được điều gì đó tương tự nếu bạn vượt qua các danh sách lồng nhau.

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

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

Bạn có thể đọc thêm về lý do tại sao điều này hoạt động ở đây.



2

Làm việc nhanh chóng

Đơn giản chỉ cần đưa danh sách vào một danh sách mới, như thực hiện đối với col2 trong khung dữ liệu bên dưới. Lý do nó hoạt động là python lấy danh sách bên ngoài (danh sách) và chuyển nó thành một cột như thể nó chứa các mục vô hướng bình thường, là danh sách trong trường hợp của chúng ta chứ không phải là danh sách vô hướng bình thường.

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

Cũng nhận được

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

sử dụng .at thay vì .loc không tạo ra sự khác biệt nào trong trường hợp của tôi, nhưng việc thực thi kiểu dữ liệu của cột khung dữ liệu đã thực hiện thủ thuật:

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

Sau đó, tôi có thể đặt danh sách, mảng numpy và tất cả mọi thứ dưới dạng giá trị ô đơn trong khung dữ liệu của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.