Làm cách nào để thêm một cột trống vào khung dữ liệu?


261

Cách dễ nhất để thêm một cột trống vào một DataFrameđối tượng gấu trúc là gì? Điều tốt nhất tôi đã vấp ngã là một cái gì đó như

df['foo'] = df.apply(lambda _: '', axis=1)

Có một phương pháp ít sai lầm hơn?


2
Bạn có thực sự muốn một cột chứa chuỗi rỗng hay không N/A?
phim

Câu trả lời:


419

Nếu tôi hiểu chính xác, bài tập nên điền:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

2
Câu trả lời này chỉ tạo ra các hàng mới cho tôi.
logicbloke

@logicbloke bạn có thể cung cấp một ví dụ về điều này đang xảy ra không?
craymichael

@craymichael Đã được một thời gian nhưng tôi tin rằng tôi có các cột được lập chỉ mục số không có tên và hàng được đặt tên và nó chỉ tạo ra một hàng mới ở cuối.
logicbloke

1
Nếu dftrống, bạn có thể muốn sử dụng df['new'] = pd.Series() (xem câu trả lời của tôi bên dưới)
Carsten

Làm thế nào để thêm nhiều cột trống?
M.

46

Để thêm vào câu trả lời của DSM và dựa trên câu hỏi liên quan này , tôi đã chia cách tiếp cận thành hai trường hợp:

  • Thêm một cột đơn: Chỉ cần gán các giá trị trống cho các cột mới, ví dụ: df['C'] = np.nan

  • Thêm nhiều cột: Tôi khuyên bạn nên sử dụng .reindex(columns=[...]) phương pháp gấu trúc để thêm các cột mới vào chỉ mục cột của khung dữ liệu. Điều này cũng hoạt động để thêm nhiều hàng mới với .reindex(rows=[...]). Lưu ý rằng các phiên bản mới hơn của Pandas (v> 0,20) cho phép bạn chỉ định axistừ khóa thay vì gán rõ ràng cho columnshoặc rows.

Dưới đây là một ví dụ thêm nhiều cột:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

hoặc là

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Bạn cũng luôn có thể nối một khung dữ liệu mới (trống) với khung dữ liệu hiện có, nhưng điều đó không cảm thấy như là pythonic đối với tôi :)


3
Ví dụ để version >= 0.20.0xóa DataFrame và thêm các cột mới dưới dạng hàng. Ví dụ về version < 0.20.0hoạt động tốt trên Phiên bản Pandas0.24.1
Lalo

@emuning Trong khi tìm kiếm câu trả lời cho câu hỏi này, cuối cùng tôi thấy câu trả lời của bạn hữu ích. Lúc đầu, tuy nhiên, nó đã không làm việc cho tôi như gấu trúc đòi hỏi , axis=1trong version = 0.25. Tôi đã cố gắng sửa đổi câu trả lời của bạn để bao gồm phiên bản cập nhật, nhưng tôi đã bị từ chối bởi @kenlukas và @il_raffa. Tôi hy vọng mọi người đấu tranh để hiểu lý do tại sao phản hồi của bạn không hiệu quả với họ - như tôi - ít nhất là đi qua nhận xét này.
Griff

@Griff - Bây giờ tôi đã cập nhật câu trả lời của mình để chính xác và rõ ràng hơn về các vấn đề tương thích phiên bản. Cảm ơn đã làm nổi bật điều này.
phát ra

35

một giải pháp thậm chí đơn giản hơn là:

df = df.reindex(columns = header_list)                

trong đó "header_list" là danh sách các tiêu đề bạn muốn xuất hiện.

bất kỳ tiêu đề nào có trong danh sách chưa được tìm thấy trong khung dữ liệu sẽ được thêm vào với các ô trống bên dưới.

vì vậy nếu

header_list = ['a','b','c', 'd']

sau đó c và d sẽ được thêm dưới dạng cột với các ô trống


2
Chính xác hơn, các cột sẽ được thêm bằng NaN.
bông cải xanh

19

Bắt đầu với v0.16.0, DF.assign()có thể được sử dụng để gán các cột mới ( đơn / nhiều ) cho a DF. Các cột này được chèn theo thứ tự bảng chữ cái ở cuối DF.

Điều này trở nên thuận lợi so với việc gán đơn giản trong trường hợp bạn muốn thực hiện một loạt các hoạt động được xâu chuỗi trực tiếp trên khung dữ liệu được trả về.

Xem xét cùng một DFmẫu được thể hiện bởi @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Lưu ý rằng điều này trả về một bản sao với tất cả các cột trước đó cùng với các cột mới được tạo. Để bản gốc DFđược sửa đổi cho phù hợp, hãy sử dụng nó như sau: df = df.assign(...)vì hiện tại nó không hỗ trợ inplacehoạt động.


Kiểu dữ liệu đó cho C là gì? Tôi đang cố gắng thêm bằng cách lặp qua một danh sách các chuỗi. Nhưng nó không sử dụng nó.
eleijonmarck

12

Tôi thích:

df['new'] = pd.Series(dtype='your_required_dtype')

Nếu bạn có một khung dữ liệu trống, giải pháp này đảm bảo rằng không có hàng mới nào chỉ chứa NaN.

Nếu dtypekhông được chỉ định, các phiên bản Pandas mới hơn sẽ tạo ra a DeprecationWarning.


5

nếu bạn muốn thêm tên cột từ danh sách

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan

4

Câu trả lời của @ emuning thực sự tuyệt vời khi thêm nhiều cột, nhưng tôi không thể làm cho nó hoạt động với tôi trong python 2.7. Thay vào đó, tôi tìm thấy tác phẩm này:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

1

Đoạn mã dưới đây giải quyết câu hỏi "Làm cách nào để thêm n số cột trống vào khung dữ liệu hiện tại của tôi". Để giữ các giải pháp cho các vấn đề tương tự ở một nơi, tôi sẽ thêm nó vào đây.

Cách tiếp cận 1 (để tạo 64 cột bổ sung với tên cột từ 1-64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Cách tiếp cận 2 (để tạo 64 cột bổ sung với tên cột từ 1-64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

1

Bạn có thể làm

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 

1

Người ta có thể sử dụng df.insert(index_to_insert_at, column_header, init_value)để chèn cột mới tại một chỉ mục cụ thể.

cost_tbl.insert(1, "col_name", "") 

Câu lệnh trên sẽ chèn một Cột trống sau cột đầu tiên.

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.