Gấu trúc Python: điền một hàng dữ liệu theo hàng


133

Nhiệm vụ đơn giản là thêm một hàng vào một pandas.DataFrameđối tượng dường như khó thực hiện. Có 3 câu hỏi stackoverflow liên quan đến vấn đề này, không có câu hỏi nào đưa ra câu trả lời hoạt động.

Đây là những gì tôi đang cố gắng làm. Tôi có một DataFrame mà tôi đã biết hình dạng cũng như tên của các hàng và cột.

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

Bây giờ, tôi có một hàm để tính toán các giá trị của các hàng lặp đi lặp lại. Làm cách nào tôi có thể điền vào một trong các hàng bằng từ điển hoặc từ điển pandas.Series? Dưới đây là những nỗ lực khác nhau đã thất bại:

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

Rõ ràng nó đã cố gắng thêm một cột thay vì một hàng.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

Thông báo lỗi rất không thông tin.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

Rõ ràng đó chỉ là để thiết lập các giá trị riêng lẻ trong khung dữ liệu.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

Chà, tôi không muốn bỏ qua chỉ số, nếu không đây là kết quả:

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

Nó đã căn chỉnh tên cột với các giá trị, nhưng mất nhãn hàng.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

Điều đó cũng thất bại thảm hại.

Vậy bạn sẽ làm sao ?

Câu trả lời:


92

df['y'] sẽ đặt một cột

vì bạn muốn đặt một hàng, sử dụng .loc

Lưu ý rằng .ixtương đương ở đây, lỗi của bạn là do bạn đã cố gán từ điển cho từng thành phần của hàng ycó thể không phải là thứ bạn muốn; chuyển đổi thành Sê-ri cho gấu trúc biết rằng bạn muốn căn chỉnh đầu vào (ví dụ: sau đó bạn không phải chỉ định tất cả các yếu tố)

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

Tôi hiểu rồi. Vì vậy, locthuộc tính của khung dữ liệu định nghĩa một đặc biệt __setitem__mà tôi cho là phép thuật.
xApple

Bạn có thể xây dựng điều này trong một lần (tức là với các cột, chỉ mục và y) không?
Andy Hayden

5
Vậy nếu tôi có thể tạo một hàng tại một thời điểm, làm thế nào tôi có thể xây dựng khung dữ liệu một cách tối ưu?
xApple

Đã mong đợi một số biến thể của df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])để làm việc?
Andy Hayden

@xApple thăm dò tốt nhất cho bạn để xây dựng một danh sách các dicts (hoặc danh sách), sau đó chỉ cần chuyển đến hàm tạo, sẽ hiệu quả hơn nhiều
Jeff

71

Cách tiếp cận của tôi là, nhưng tôi không thể đảm bảo rằng đây là giải pháp nhanh nhất.

df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

4
Điều này làm việc rất tốt cho tôi và tôi thích thực tế là bạn rõ ràng appenddữ liệu vào khung dữ liệu.
Jonny Brooks

1
Lưu ý rằng câu trả lời này cần mỗi hàng để thêm tên cột. Tương tự cho câu trả lời được chấp nhận.
pashute

Điều này cũng hoạt động nếu bạn không biết trước số lượng hàng.
irene

34

Đây là một phiên bản đơn giản hơn

import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

4
chỉ muốn hỏi, CPU và bộ nhớ này có hiệu quả không?
czxttkl

1
Làm thế nào để tôi biết hàng cuối cùng của df vì vậy tôi thêm vào hàng cuối cùng mỗi lần?
pashute

24

Nếu các hàng đầu vào của bạn là danh sách thay vì từ điển, thì sau đây là một giải pháp đơn giản:

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6

nhưng tôi phải làm gì nếu tôi có nhiều chỉ số? df1 = pd.DataFrame (list_of_lists, cột ['A', 'B', 'C'], index = ['A', 'B']) không hoạt động. Hình dạng sai. Vậy làm thế nào?
pashute
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.