Programing

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

lottogame 2020. 4. 15. 10:24
반응형

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


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

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

참고 : .ix Pandas v0.20부터 더 이상 사용되지 않습니다. 대신 사용해야 .loc또는 .iloc적절하게.


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

동등한

 >>> print(df2.loc[140:160,['Relevance','Title']])
 >>> print(df2.ix[140:160,[3,7]])

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

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의 실제 값을 요소 단위로 계산합니다.

또 다른 방법은 이렇게하는 것입니다, 당신은 모든 행을 원하는 가정, 당신의 DataFrame에서 컬럼의 서브 세트를 얻을 :
data[['a','b']]그리고 data[['c','d','e']]
당신은 숫자 열 인덱스를 사용하려면 당신은 할 수 있습니다 :
data[data.columns[:2]]data[data.columns[2:]]

참고 URL : https://stackoverflow.com/questions/10665889/how-to-take-column-slices-of-dataframe-in-pandas

반응형