팬더에서 데이터 프레임의 열 조각을 가져 오는 방법


264

CSV 파일에서 일부 기계 학습 데이터를로드합니다. 처음 2 개의 열은 관측치이고 나머지 열은 피처입니다.

현재 다음을 수행합니다.

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

그것은 다음과 같은 것을 제공합니다 :

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

나는 두 dataframes이 dataframe 슬라이스 싶습니다 하나의 열을 포함 a하고 b하나가 열을 포함하는 c, d하고 e.

같은 것을 쓸 수 없습니다

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

가장 좋은 방법이 무엇인지 잘 모르겠습니다. 내가 필요 pd.Panel합니까?

그건 그렇고, 데이터 프레임 인덱싱이 거의 일치하지 않습니다 : data['a']허용되지만 허용 data[0]되지 않습니다. 다른 한편으로 data['a':]는 허용되지 않지만 data[0:]입니다. 이에 대한 실질적인 이유가 있습니까? Int가 열을 색인화하면 혼란 스럽습니다.data[0] != data[0:1]


3
DataFrame은 df [...]를 수행 할 때 본질적으로 dict-like 객체이지만 df[5:10]행을 선택하기 위해 추가 된 편의 ( pandas.pydata.org/pandas-docs/stable/… ) 가 추가되었습니다.
Wes McKinney

1
그렇다면이 불일치가 편의를위한 디자인 결정은 무엇입니까? 그래도 초보자에게는 더 분명해야합니다!
cpa

3
편의 지원을 고려한 설계 고려 사항은 학습 곡선을 훨씬 가파르게 만듭니다. 일관된 인터페이스를 제시하는 처음에 더 나은 문서가 있기를 바랍니다. 예를 들어, ix 인터페이스에 집중하십시오.
Yu Shen

답변:


243

2017 답변-pandas 0.20 : .ix는 사용되지 않습니다. .loc 사용

문서 에서 지원 중단 참조

.loc레이블 기반 인덱싱을 사용하여 행과 열을 모두 선택합니다. 레이블은 인덱스 또는 열의 값입니다. 슬라이싱 .loc에는 마지막 요소 가 포함됩니다.

하자 우리는 다음과 같은 열이있는 DataFrame가 있다고 가정 :
foo, bar, quz, ant, cat, sat, dat.

# 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파이썬리스트가 행과 열에 대해하는 것과 동일한 슬라이스 표기법을 받아들입니다. 슬라이스 표기법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. 그것을 고치면 그것을 찬성 할 것입니다.
크레인

1
@craned-맞지 않습니다. Pandas 문서에서 : .loc은 주로 레이블을 기반으로하지만 부울 배열과 함께 사용될 수도 있습니다. 항목을 찾을 수 없으면 .loc에서 KeyError가 발생합니다. .iloc 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

여기서 .ix [row slice, column slice]는 해석중인 것입니다. 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
여러 열 운전실이 이와 같이 전달됨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 2016 년

75

seaborn 패키지의 타이타닉 데이터 셋을 예로 들어 보자

# 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 방법을 사용하면 매우 효과적으로 사용할 수 있습니다. 당신이 알아야 할 것은 추출하려는 열의 색인입니다. 예를 들면 다음과 같습니다.

>>> 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

DataFrame다음과 같이 목록에서 각 열의 이름을 참조하여 a의 열을 따라 슬라이스 할 수 있습니다 .

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

따라서 'b'열에서 시작하는 모든 데이터를 원하면 data.columns에서 'b'의 색인을 찾아 data [data.columns [1 :]]해야합니까? 이것이 정식 운영 방법입니까?
cpa

1
'b'부터 모든 열을 선택 하시겠습니까?
Brendan Wood

예, 또는 주어진 범위의 모든 열을 선택하십시오.
cpa

나는 판다를 처음 접하기 때문에 정식으로 간주되는 것에 대해 말할 수 없습니다. 나는 당신이 말한 것처럼 할 것이지만 get_locon 함수를 사용하여 data.columns'b'열의 색인 또는 기타를 결정하십시오.
Brendan Wood

20

그리고 당신이 여기에 와서 두 범위의 열을 얇게 썰고 (나처럼) 결합하면 다음과 같은 일을 할 수 있습니다

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

이렇게하면 처음 900 개의 열과 (모든) 열이> 3593 인 새 데이터 프레임이 만들어집니다 (데이터 세트에 약 4000 개의 열이 있다고 가정).


누군가가 이것을 시도해 보았습니다 ... 처음 900 열을 얻는이 0 : 899 궁금합니다. 왜 그들이 이렇게 했습니까? 이것은 전혀 파이썬처럼 느껴지지 않습니다. 파이썬에서 범위를 사용할 때 항상 '포함 할 때까지'가 아닌 '까지'입니다.
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

데이터 프레임이 다음과 같은 경우 :

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

OUTPUT은

   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 AND x2의 진리 값을 요소 단위로 계산합니다.

  2. logical_or (x1, x2, / [, out, where, cast, ...]) x1 또는 x2의 진리 값을 요소 단위로 계산합니다.

  3. logical_not (x, / [, out, where, cast, ...]) NOT x의 진리 값을 요소 단위로 계산합니다.
  4. logical_xor (x1, x2, / [, out, where, ..]) 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.