programing

판다의 데이터 프레임 컬럼 슬라이스를 가져오는 방법

projobs 2022. 9. 22. 22:05
반응형

판다의 데이터 프레임 컬럼 슬라이스를 가져오는 방법

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

현재 다음과 같은 작업을 하고 있습니다.

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

그 결과 다음과 같은 결과가 나타납니다.

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

이 데이터 프레임을 두 개의 데이터 프레임으로 슬라이스하고 싶습니다. 하나는 열을 포함합니다.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년 답변 - 판다 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는 Python 목록이 행과 열 모두에 대해 사용하는 것과 동일한 슬라이스 표기법을 사용할 수 있습니다.슬라이스 표기법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팬더 v0.20 이후 폐지되었습니다.대신,.loc또는.iloc(필요에 따라).

데이터 프레임ix 인덱스는 액세스하려는 대상입니다.조금 혼란스럽긴 하지만(판다 인덱싱이 때때로 혼란스럽다는 것에 동의합니다!) 다음은 당신이 원하는 대로 할 수 있는 것 같습니다.

>>> 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]는 해석되는 것입니다.팬더 인덱스에 대한 자세한 내용은 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]]

using ix (팬더보다 오래된 버전) <.20 버전)

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

또는

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

reindex 메서드 사용

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

또, 데이터 프레임의 경우

데이터.

예시와 같이 열 a와 d만 추출하려면(예: 첫 번째와 네 번째 열), 팬더 데이터 프레임에서 iloc matawod가 필요하며 매우 효과적으로 사용할 수 있습니다.추출할 열의 색인만 알면 됩니다.예를 들어 다음과 같습니다.

>>> 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다음과 같이 목록의 각 열 이름을 참조합니다.

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

모든 행을 원하는 경우 DataFrame에서 열의 하위 집합을 가져오는 또 다른 방법은 다음과 같습니다.
data[['a','b']] ★★★★★★★★★★★★★★★★★」data[['c','d','e']]
숫자 열 인덱스를 사용하려면 다음을 수행할 수 있습니다.
data[data.columns[:2]] ★★★★★★★★★★★★★★★★★」data[data.columns[2:]]

등가

 >>> 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, casting, ...]) x1 또는 x2 요소의 실제 값을 계산합니다.

  3. logical_not(x, /[, out, where, casting, ...]) NOT x 요소의 참값을 계산합니다.
  4. logical_xor(x1, x2, /[, out, where, ..]) x1 XOR x2의 참값을 요소별로 계산합니다.

다음 방법을 사용할 수 있습니다.

df = pd.DataFrame(np.random.rand(10, 5), columns = list('abcde'))

df_ab = df.truncate(before='a', after='b', axis=1)
df_cde = df.truncate(before='c', axis=1)

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

반응형