วิธีนำส่วนข้อมูลคอลัมน์มาเป็นชิ้นแพนด้า


264

ฉันโหลดข้อมูลการเรียนรู้ของเครื่องจากไฟล์ CSV 2 คอลัมน์แรกคือการสังเกตและคอลัมน์ที่เหลือเป็นคุณลักษณะ

ขณะนี้ฉันทำต่อไปนี้:

data = pandas.read_csv('mydata.csv')

ซึ่งให้บางสิ่งเช่น:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

ฉันต้องการที่จะหั่น dataframe นี้ในสอง dataframes หนึ่งที่มีคอลัมน์aและbและเป็นหนึ่งที่มีคอลัมน์c, และde

ไม่สามารถเขียนบางอย่างเช่น

observations = data[:'c']
features = data['c':]

ฉันไม่แน่ใจว่าวิธีที่ดีที่สุดคืออะไร ฉันต้องมีpd.Panel?

โดยวิธีการที่ฉันพบการจัดทำดัชนี dataframe สวยไม่สอดคล้อง: data['a']ได้รับอนุญาต แต่data[0]ไม่ใช่ ในอีกด้านหนึ่งdata['a':]ไม่ได้รับอนุญาต แต่data[0:]เป็น มีเหตุผลในทางปฏิบัติสำหรับสิ่งนี้หรือไม่? นี่จะทำให้สับสนถ้าคอลัมน์ถูกทำดัชนีโดย Intdata[0] != data[0:1]


3
DataFrame เป็นวัตถุที่มีลักษณะเหมือนคำสั่งเมื่อคุณทำ df [... ] อย่างไรก็ตามสิ่งอำนวยความสะดวกบางอย่างเช่นdf[5:10]ถูกเพิ่มสำหรับการเลือกแถว ( pandas.pydata.org/pandas-docs/stable/ ...... )
Wes McKinney

1
ดังนั้นสิ่งที่ไม่สอดคล้องกันนี้คือการตัดสินใจออกแบบเพื่อความสะดวก? เอาล่ะ แต่มันจำเป็นต้องชัดเจนสำหรับผู้เริ่มต้น!
cpa

3
การพิจารณาออกแบบรองรับความสะดวกสบายทำให้ช่วงการเรียนรู้สูงชันมาก ฉันหวังว่าจะมีเอกสารที่ดีกว่าสำหรับการเริ่มต้นเพียงแสดงอินเทอร์เฟซที่สอดคล้องกัน ตัวอย่างเช่นเพียงมุ่งเน้นไปที่อินเตอร์เฟส ix
Yu Shen

คำตอบ:


243

2017 คำตอบ - นุ่น 0.20: .ix เลิกใช้แล้ว ใช้. loc

ดูการคัดค้านในเอกสาร

.locใช้การจัดทำดัชนีตามป้ายกำกับเพื่อเลือกทั้งแถวและคอลัมน์ เลเบลเป็นค่าของดัชนีหรือคอลัมน์ การแบ่งส่วนรวมกับ.locองค์ประกอบสุดท้าย

สมมติว่าเรามี DataFrame กับคอลัมน์ต่อไปนี้:
foo, bar, quz, ant, cat, ,satdat

# selects all rows and all columns beginning at 'foo' up to and including 'sat'
df.loc[:, 'foo':'sat']
# foo bar quz ant cat sat

.locยอมรับสัญกรณ์ชิ้นเดียวกับที่รายการ Python ทำกับทั้งแถวและคอลัมน์ สัญกรณ์ Slice เป็นstart:stop:step

# slice from 'foo' to 'cat' by every 2nd column
df.loc[:, 'foo':'cat':2]
# foo quz cat

# slice from the beginning to 'bar'
df.loc[:, :'bar']
# foo bar

# slice from 'quz' to the end by 3
df.loc[:, 'quz'::3]
# quz sat

# attempt from 'sat' to 'bar'
df.loc[:, 'sat':'bar']
# no columns returned

# slice from 'sat' to 'bar'
df.loc[:, 'sat':'bar':-1]
sat cat ant quz bar

# slice notation is syntatic sugar for the slice function
# slice from 'quz' to the end by 2 with slice function
df.loc[:, slice('quz',None, 2)]
# quz cat dat

# select specific columns with a list
# select columns foo, bar and dat
df.loc[:, ['foo','bar','dat']]
# foo bar dat

คุณสามารถแบ่งตามแถวและคอลัมน์ ตัวอย่างเช่นถ้าคุณมี 5 แถวที่มีป้ายชื่อv, w, x, y,z

# slice from 'w' to 'y' and 'foo' to 'ant' by 3
df.loc['w':'y', 'foo':'ant':3]
#    foo ant
# w
# x
# y

ถ้าใช้ของคุณใช้กับแถวแลมบ์ดาเช่น: df['newcol'] = df.apply(lambda row: myfunc(row), axis=1) แล้วคุณสามารถในmyfunc(row){... row['foo':'ant']การใช้งาน ตัวอย่างเช่น (ตามคำตอบ StackOverflow นี้ ) ภายในmyfuncคุณสามารถประเมินว่าสิ่งเหล่านี้ไม่ใช่ตัวเลข:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
pashute

4
.iloc.locควรใช้ในขณะนี้แทน แก้ไขมันแล้วฉันจะลงคะแนนมัน
craned

1
@craned - ไม่ถูกต้อง จากเอกสารของ Pandas: .loc เป็นหลักโดยใช้เลเบล แต่อาจใช้กับอาเรย์บูลีนได้ . loc จะเพิ่ม KeyError เมื่อไม่พบรายการ คำสั่งที่คล้ายกันทำเกี่ยวกับ. excep มันโดยเฉพาะหมายถึงการแบ่งตามดัชนี กล่าวอีกนัยหนึ่งในตัวอย่างนี้เขาใช้การจัดทำดัชนีโดยใช้ป้ายกำกับและ. loc เป็นตัวเลือกที่ถูกต้อง ถ้าคุณต้องการแบ่งตามตำแหน่ง - แถว 5:10 ให้ใช้ .iloc
user2103050

149

หมายเหตุ: .ixเลิกใช้แล้วตั้งแต่ Pandas v0.20 คุณควรใช้.locหรือ.ilocตามความเหมาะสม

ดัชนี DataFrame.ix คือสิ่งที่คุณต้องการเข้าถึง มันค่อนข้างสับสนเล็กน้อย (ฉันยอมรับว่าการทำดัชนีของ Pandas ทำให้สับสนในบางครั้ง!) แต่สิ่งต่อไปนี้ดูเหมือนจะทำสิ่งที่คุณต้องการ:

>>> df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
>>> df.ix[:,'b':]
      b         c         d         e
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

โดยที่. [การแบ่งแถวชิ้นส่วนคอลัมน์] คือสิ่งที่กำลังถูกตีความ ข้อมูลเพิ่มเติมเกี่ยวกับการจัดทำดัชนีของ Pandas ที่นี่: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced


5
ระวังที่ช่วงในหมีแพนด้ารวมถึงจุดสิ้นสุดทั้งสองคือ>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
ตั๊กแตน

21
cab หลายคอลัมน์ถูกส่งผ่านเช่นนี้df.ix[:,[0,3,4]]
user602599

3
@Karmel: ดูเหมือนข้อผิดพลาดการคัดลอก / วางในผลลัพธ์ด้านบน คุณอาจหมายถึงdf.ix[:,'b':'e']?
ChaimG

6
ใช้ดีกว่าlocแทนix: stackoverflow.com/a/31593712/4323
John Zwinck

5
ต้องลบคำตอบเก่า ๆ แบบนี้ .ix เลิกใช้แล้วและไม่ควรใช้
Ted Petrou

75

ให้ใช้ชุดข้อมูลไททานิกจากแพ็คเกจทะเลเป็นตัวอย่าง

# Load dataset (pip install seaborn)
>> import seaborn.apionly as sns
>> titanic = sns.load_dataset('titanic')

ใช้ชื่อคอลัมน์

>> titanic.loc[:,['sex','age','fare']]

ใช้ดัชนีคอลัมน์

>> titanic.iloc[:,[2,3,6]]

ใช้ ix (เก่ากว่า Pandas <.20 เวอร์ชั่น)

>> titanic.ix[:,[‘sex’,’age’,’fare’]]

หรือ

>> titanic.ix[:,[2,3,6]]

ใช้วิธีการทำดัชนี

>> titanic.reindex(columns=['sex','age','fare'])

6
ในนุ่น 0.20: .ixถูกคัดค้าน
Shihe Zhang

คำเตือนการเลิกใช้: Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.เมื่อคุณใช้df.loc[:, some_list_of_columns]
Marc Maxmeister

35

นอกจากนี้ยังได้รับ DataFrame

ข้อมูล

เช่นในตัวอย่างของคุณหากคุณต้องการแยกคอลัมน์ a และ d เท่านั้น (เช่นคอลัมน์ที่ 1 และคอลัมน์ที่ 4) iloc mothod จาก pafas dataframe คือสิ่งที่คุณต้องการและสามารถใช้ได้อย่างมีประสิทธิภาพมาก สิ่งที่คุณต้องรู้คือดัชนีของคอลัมน์ที่คุณต้องการแยก ตัวอย่างเช่น:

>>> data.iloc[:,[0,3]]

จะให้คุณ

          a         d
0  0.883283  0.100975
1  0.614313  0.221731
2  0.438963  0.224361
3  0.466078  0.703347
4  0.955285  0.114033
5  0.268443  0.416996
6  0.613241  0.327548
7  0.370784  0.359159
8  0.692708  0.659410
9  0.806624  0.875476

25

คุณสามารถแบ่งตามคอลัมน์ของ a DataFrameโดยอ้างอิงชื่อของแต่ละคอลัมน์ในรายการดังนี้:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
data_ab = data[list('ab')]
data_cde = data[list('cde')]

ดังนั้นถ้าฉันต้องการข้อมูลทั้งหมดที่เริ่มต้นจากคอลัมน์ 'b' ฉันต้องค้นหาดัชนีของ 'b' ใน data.columns และทำ data [data.columns [1:]]? นั่นเป็นวิธีมาตรฐานในการใช้งานหรือไม่
cpa

1
คุณหมายถึงคุณต้องการเลือกคอลัมน์ทั้งหมดจาก 'b' เป็นต้นไปหรือไม่
Brendan Wood

ใช่หรือเลือกคอลัมน์ทั้งหมดในช่วงที่กำหนด
CPA

ฉันค่อนข้างใหม่กับนุ่นตัวเองดังนั้นฉันจึงไม่สามารถพูดเกี่ยวกับสิ่งที่ถือว่าเป็นบัญญัติ ฉันจะทำอย่างที่คุณพูด แต่ใช้get_locฟังก์ชั่นdata.columnsเพื่อกำหนดดัชนีของคอลัมน์ 'b' หรืออะไรก็ตาม
Brendan Wood

20

และถ้าคุณมาที่นี่เพื่อค้นหาการแบ่งคอลัมน์สองช่วงแล้วรวมเข้าด้วยกัน (เช่นฉัน) คุณสามารถทำสิ่งที่ต้องการ

op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
print op

สิ่งนี้จะสร้างดาต้าเฟรมใหม่ที่มีคอลัมน์แรก 900 คอลัมน์และ (ทั้งหมด) คอลัมน์> 3593 (สมมติว่าคุณมี 4000 คอลัมน์ในชุดข้อมูลของคุณ)


เยี่ยมมากมีบางคนทดลองใช้แล้ว ... ฉันสงสัยว่า 0: 899 นี้จะได้รับคอลัมน์แรก 900 .. ทำไมพวกเขาถึงทำแบบนี้ สิ่งนี้ไม่รู้สึกเหมือนงูหลามเลย เมื่อใช้ช่วงในงูหลามมันจะ 'จนถึง' ไม่ 'จนถึงและรวมอยู่ด้วย'
zwep

14

นี่คือวิธีที่คุณสามารถใช้วิธีการต่าง ๆ ในการทำการแบ่งคอลัมน์แบบเลือกรวมถึงการใช้เลเบลแบบเลือก, ดัชนีที่ใช้และการแบ่งคอลัมน์ตามช่วงที่เลือก

In [37]: import pandas as pd    
In [38]: import numpy as np
In [43]: df = pd.DataFrame(np.random.rand(4,7), columns = list('abcdefg'))

In [44]: df
Out[44]: 
          a         b         c         d         e         f         g
0  0.409038  0.745497  0.890767  0.945890  0.014655  0.458070  0.786633
1  0.570642  0.181552  0.794599  0.036340  0.907011  0.655237  0.735268
2  0.568440  0.501638  0.186635  0.441445  0.703312  0.187447  0.604305
3  0.679125  0.642817  0.697628  0.391686  0.698381  0.936899  0.101806

In [45]: df.loc[:, ["a", "b", "c"]] ## label based selective column slicing 
Out[45]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

In [46]: df.loc[:, "a":"c"] ## label based column ranges slicing 
Out[46]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

In [47]: df.iloc[:, 0:3] ## index based column ranges slicing 
Out[47]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

### with 2 different column ranges, index based slicing: 
In [49]: df[df.columns[0:1].tolist() + df.columns[1:3].tolist()]
Out[49]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

โปรดพยายามหลีกเลี่ยงเพียงแค่ทิ้งรหัสเป็นคำตอบและพยายามอธิบายว่ามันทำอะไรและทำไม รหัสของคุณอาจไม่ชัดเจนสำหรับผู้ที่ไม่มีประสบการณ์การเข้ารหัสที่เกี่ยวข้อง โปรดแก้ไขคำตอบของคุณเพื่อรวมคำอธิบายบริบทและพยายามพูดถึงข้อ จำกัด ข้อสมมติฐานหรือการทำให้เข้าใจง่ายในคำตอบของคุณ
SᴀᴍOnᴇᴌᴀ


1

ถ้า Data data ดูเหมือนว่า:

group         name      count
fruit         apple     90
fruit         banana    150
fruit         orange    130
vegetable     broccoli  80
vegetable     kale      70
vegetable     lettuce   125

และผลลัพธ์อาจเป็นเช่นนั้น

   group    name  count
0  fruit   apple     90
1  fruit  banana    150
2  fruit  orange    130

ถ้าคุณใช้ตัวดำเนินการเชิงตรรกะ np.logical_not

df[np.logical_not(df['group'] == 'vegetable')]

เพิ่มเติมเกี่ยวกับ

https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html

ตัวดำเนินการเชิงตรรกะอื่น ๆ

  1. logical_and (x1, x2, / [, out, where, ... ]) คำนวณค่าความจริงของ x1 และ x2 องค์ประกอบที่ชาญฉลาด

  2. logical_or (x1, x2, / [, ออก, ที่ไหน, การคัดเลือก, ... ]) คำนวณค่าความจริงขององค์ประกอบ x1 หรือ x2 ที่ชาญฉลาด

  3. logical_not (x, / [, ออก, ที่ไหน, การคัดเลือก, ... ]) คำนวณค่าความจริงของ NOT x องค์ประกอบที่ชาญฉลาด
  4. logical_xor (x1, x2, / [, ออก, ที่ไหน, .. ]) คำนวณค่าความจริงของ x1 XOR x2 องค์ประกอบที่ชาญฉลาด

0

อีกวิธีในการรับชุดย่อยของคอลัมน์จาก DataFrame ของคุณโดยสมมติว่าคุณต้องการแถวทั้งหมดจะต้องทำ:
data[['a','b']]และdata[['c','d','e']]
ถ้าคุณต้องการใช้ดัชนีคอลัมน์ตัวเลขคุณสามารถทำได้:
data[data.columns[:2]]และdata[data.columns[2:]]

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