วิธีเพิ่มคอลัมน์ว่างใน dataframe


261

วิธีที่ง่ายที่สุดในการเพิ่มคอลัมน์ว่างลงในDataFrameวัตถุแพนด้าคืออะไร สิ่งที่ดีที่สุดที่ฉันเคยเจอคือสิ่งที่ชอบ

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

มีวิธีที่ผิดปกติน้อยลงหรือไม่?


2
คุณต้องการคอลัมน์ที่มีสตริงว่างหรือเปล่าN/A?
ภาพยนตร์

คำตอบ:


419

ถ้าฉันเข้าใจถูกต้องการมอบหมายควรเติม:

>>> 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
คำตอบนี้เพิ่งสร้างแถวใหม่ให้ฉัน
logicbloke

@logicbloke คุณสามารถให้ตัวอย่างที่เกิดขึ้นได้หรือไม่
craymichael

@craymichael นานแล้ว แต่ฉันเชื่อว่าฉันมีคอลัมน์ที่มีการทำดัชนีจำนวนโดยไม่มีชื่อและแถวที่มีชื่อและมันเพิ่งสร้างแถวใหม่ในตอนท้าย
logicbloke

1
ถ้าdfว่างเปล่าคุณอาจต้องการใช้df['new'] = pd.Series() (ดูคำตอบของฉันด้านล่าง)
Carsten

วิธีเพิ่มคอลัมน์ว่างหลายคอลัมน์
M. Mariscal

46

หากต้องการเพิ่มคำตอบและการสร้างคำถามที่เกี่ยวข้องนี้ของ DSM ฉันได้แบ่งวิธีการออกเป็นสองกรณี:

  • การเพิ่มคอลัมน์เดียว: เพียงแค่กำหนดค่าว่างให้กับคอลัมน์ใหม่เช่น df['C'] = np.nan

  • การเพิ่มหลายคอลัมน์: ฉันขอแนะนำให้ใช้.reindex(columns=[...]) วิธีการของนุ่นในการเพิ่มคอลัมน์ใหม่ในดัชนีคอลัมน์ของ dataframe .reindex(rows=[...])นอกจากนี้ยังทำงานสำหรับการเพิ่มแถวใหม่หลายกับ โปรดทราบว่ารุ่นใหม่ของนุ่น (V> 0.20) ช่วยให้คุณสามารถระบุaxisคำหลักมากกว่าอย่างชัดเจนมอบหมายให้หรือcolumnsrows

นี่คือตัวอย่างการเพิ่มหลายคอลัมน์:

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

หรือ

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

คุณยังสามารถต่อเชื่อม dataframe (ว่าง) ใหม่กับ dataframe ที่มีอยู่เดิมได้ แต่นั่นก็ไม่ได้ทำให้ฉันรู้สึกไพเราะ :)


3
ตัวอย่างสำหรับการversion >= 0.20.0ลบ DataFrame และเพิ่มคอลัมน์ใหม่เป็นแถว ตัวอย่างversion < 0.20.0ผลงานดีในรุ่น Pandas0.24.1
Lalo

@emunsing ในขณะที่ค้นหาคำตอบสำหรับคำถามนี้ในที่สุดฉันก็พบว่าคำตอบของคุณมีประโยชน์ ในตอนแรก แต่มันก็ไม่ได้ทำงานให้ฉันเป็นนุ่นต้องใช้ใน, axis=1 version = 0.25ฉันพยายามแก้ไขคำตอบของคุณเพื่อรวมเวอร์ชันที่อัปเดตแล้ว แต่ฉันถูกปฏิเสธโดย @kenlukas และ @il_raffa ฉันหวังว่าทุกคนจะดิ้นรนเพื่อทำความเข้าใจว่าทำไมคำตอบของคุณไม่ทำงานสำหรับพวกเขา - อย่างที่ฉันเป็น - อย่างน้อยก็เจอความคิดเห็นนี้
Griff

@Griff - ฉันได้อัปเดตคำตอบของฉันให้แม่นยำยิ่งขึ้นและชัดเจนขึ้นเกี่ยวกับปัญหาความเข้ากันได้ของเวอร์ชัน ขอขอบคุณที่เน้นสิ่งนี้
ปล่อย

35

ทางออกที่ง่ายกว่าคือ:

df = df.reindex(columns = header_list)                

โดยที่ "header_list" คือรายการส่วนหัวที่คุณต้องการให้ปรากฏ

ส่วนหัวใด ๆ ที่รวมอยู่ในรายการที่ไม่พบแล้วใน dataframe จะถูกเพิ่มด้วยเซลล์ว่างด้านล่าง

ดังนั้นถ้า

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

จากนั้น c และ d จะถูกเพิ่มเป็นคอลัมน์ที่มีเซลล์ว่าง


2
แม่นยำยิ่งขึ้นคอลัมน์จะถูกเพิ่มด้วย NaNs
บรอกโคลี

19

เริ่มต้นด้วยv0.16.0, DF.assign()สามารถนำมาใช้กับคอลัมน์ใหม่กำหนด ( / หลายเดียว ) DFไปยัง DFคอลัมน์เหล่านี้ได้รับการแทรกอยู่ในลำดับตัวอักษรในตอนท้ายของ

สิ่งนี้จะได้เปรียบเมื่อเทียบกับการมอบหมายอย่างง่ายในกรณีที่คุณต้องการดำเนินการชุดของการดำเนินการที่ถูกผูกมัดโดยตรงบน dataframe ที่ส่งคืนโดยตรง

พิจารณาDFตัวอย่างเดียวกันที่แสดงโดย @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

โปรดทราบว่าสิ่งนี้จะส่งคืนสำเนาที่มีคอลัมน์ก่อนหน้าทั้งหมดพร้อมกับคอลัมน์ที่สร้างขึ้นใหม่ เพื่อที่DFจะให้ต้นฉบับถูกดัดแปลงให้ใช้มันเหมือน: df = df.assign(...)เพราะมันไม่รองรับinplaceการทำงานในปัจจุบัน


ประเภทข้อมูลสำหรับ C คืออะไร ฉันกำลังพยายามเพิ่มโดยการวนซ้ำผ่านรายการสตริง แต่มันไม่ได้ใช้
eleijonmarck

12

ฉันชอบ:

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

หากคุณมี dataframe ว่าง, การแก้ปัญหานี้จะทำให้แน่ใจว่าไม่มีแถวใหม่ที่มีเพียงNaNถูกเพิ่ม

หากไม่ได้ระบุรุ่นใหม่นุ่นผลิตdtypeDeprecationWarning


5

หากคุณต้องการเพิ่มชื่อคอลัมน์จากรายการ

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

4

@ emunsing คำตอบนั้นเจ๋งจริง ๆ สำหรับการเพิ่มหลายคอลัมน์ แต่ฉันไม่สามารถทำให้มันทำงานได้ใน python 2.7 ฉันกลับพบว่างานนี้:

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

1

รหัสด้านล่างตอบคำถาม "ฉันจะเพิ่มจำนวนคอลัมน์ที่ว่างเปล่าใน dataframe ที่มีอยู่ของฉันได้อย่างไร" เพื่อเพิ่มความน่าเชื่อถือของการแก้ปัญหาที่คล้ายกันในที่เดียวฉันเพิ่มที่นี่

วิธีที่ 1 (เพื่อสร้าง 64 คอลัมน์เพิ่มเติมพร้อมชื่อคอลัมน์ตั้งแต่ 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

วิธีที่ 2 (เพื่อสร้าง 64 คอลัมน์เพิ่มเติมพร้อมชื่อคอลัมน์ตั้งแต่ 1-64)

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

1

คุณทำได้

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

หนึ่งสามารถใช้df.insert(index_to_insert_at, column_header, init_value)เพื่อแทรกคอลัมน์ใหม่ที่ดัชนีเฉพาะ

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

ข้อความข้างต้นจะแทรกคอลัมน์ว่างหลังจากคอลัมน์แรก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.