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

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]



답변

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


답변

참고 : .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


답변

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'])


답변

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


답변

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

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


답변

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

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

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


답변

선택적 레이블 기반, 인덱스 기반 및 선택적 범위 기반 열 슬라이싱을 포함하여 다양한 방법으로 선택적 열 슬라이싱을 수행하는 방법은 다음과 같습니다 .

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