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