แยกคอลัมน์ที่เลือกเฉพาะไปยัง DataFrame ใหม่เป็นสำเนา


185

ฉันมี DataFrame แพนด้ามี 4 คอลัมน์และฉันต้องการสร้างDataFrame ใหม่ที่มีเพียงสามคอลัมน์เท่านั้น คำถามนี้คล้ายกับ: การแยกคอลัมน์เฉพาะออกจาก data frameแต่สำหรับ pandas ไม่ใช่ R รหัสต่อไปนี้ใช้ไม่ได้ทำให้เกิดข้อผิดพลาดและไม่ใช่วิธี pandasnic อย่างแน่นอน

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator 

วิธีการทำ pandasnic คืออะไร?

คำตอบ:


359

มีวิธีการทำสิ่งนี้และมันก็ดูคล้ายกับอาร์

new = old[['A', 'C', 'D']].copy()

ที่นี่คุณเพียงแค่เลือกคอลัมน์ที่คุณต้องการจากกรอบข้อมูลดั้งเดิมและสร้างตัวแปรสำหรับคอลัมน์เหล่านั้น หากคุณต้องการที่จะปรับเปลี่ยน dataframe ใหม่ที่ทุกคนคุณอาจจะต้องการที่จะใช้เพื่อหลีกเลี่ยงการ.copy()SettingWithCopyWarning

วิธีอื่นคือการใช้filterซึ่งจะสร้างสำเนาโดยค่าเริ่มต้น:

new = old.filter(['A','B','D'], axis=1)

สุดท้ายขึ้นอยู่กับจำนวนคอลัมน์ในดาต้าเฟรมดั้งเดิมของคุณมันอาจจะง่ายกว่าที่จะแสดงสิ่งนี้โดยใช้drop(สิ่งนี้จะสร้างสำเนาตามค่าเริ่มต้น):

new = old.drop('B', axis=1)

20
ข้อควรระวังหากเพิ่งคัดลอกหนึ่งคอลัมน์: ในold[['A']].copy()จำเป็นต้องใช้วงเล็บเหลี่ยมคู่เพื่อสร้างกรอบข้อมูลใหม่ โปรดทราบว่าold['A'].copy()จะสร้างซีรี่ส์เท่านั้น
intotecho

19

วิธีที่ง่ายที่สุดคือ

new = old[['A','C','D']]

.


3
นี่ไม่ใช่การทำสำเนาเว้นแต่ว่าคุณจะเรียก. คัดลอก ()
Sylvain

สำเนานี้เป็นค่าเริ่มต้น
เหงียนอัล

2
@ ไม่ได้ระบุพฤติกรรมของการทำดัชนีอย่างง่าย คุณจะไม่ทราบว่าคุณได้รับสำเนาหรือมุมมอง ดูเอกสารสำหรับรายละเอียดเพิ่มเติม: pandas.pydata.org/pandas-docs/stable/user_guide/ …
Ole Fass

8

อีกวิธีที่ง่ายกว่าน่าจะเป็น:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

ที่ไหนold.column_nameจะให้ชุด ทำรายการชุดคอลัมน์ทั้งหมดที่คุณต้องการเก็บไว้และส่งต่อไปยังตัวสร้าง DataFrame เราต้องทำการสลับเพื่อปรับรูปร่าง

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

ใช้งานได้ แต่ไม่ใช่ถ้า column_name มีอักขระพิเศษ
jimh

โอ้ไม่ได้คิดอย่างนั้น
ตี

3

รูปแบบการทำงานทั่วไป

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

เฉพาะปัญหาของคุณด้านบน

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

หากคุณต้องการมี data frame ใหม่ให้ทำดังนี้

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]

1

เท่าที่ฉันสามารถบอกคุณไม่จำเป็นต้องระบุแกนเมื่อใช้ฟังก์ชั่นตัวกรอง

new = old.filter(['A','B','D'])

ส่งคืน dataframe เดียวกันกับ

new = old.filter(['A','B','D'], axis=1)

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