[python] 팬더 데이터 프레임에서 여러 열 선택

다른 열에 데이터가 있지만 다른 변수에 저장하기 위해 추출하는 방법을 모르겠습니다.

index  a   b   c
1      2   3   4
2      3   4   5

어떻게 선택합니까 'a', 'b'그리고 DF1에 저장?

나는 시도했다

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

아무것도 작동하지 않는 것 같습니다.



답변

시도한 방식으로 열 이름 (문자열)을 슬라이스 할 수 없습니다.

여기 몇 가지 옵션이 있습니다. 컨텍스트에서 어떤 변수를 분리 하려는지 알고 있다면 __getitem__구문 ([])에 목록을 전달하여 해당 열에 대한보기 만 반환하면됩니다 .

df1 = df[['a','b']]

또는 이름이 아닌 숫자로 색인을 생성 해야하는 경우 (코드가 처음 두 열의 이름을 몰라도 자동으로 수행해야 함) 대신 다음을 수행 할 수 있습니다.

df1 = df.iloc[:,0:2] # Remember that Python does not slice inclusive of the ending index.

또한 Pandas 객체에 대한 관점과 해당 객체의 사본에 대한 아이디어를 숙지해야합니다. 위의 첫 번째 방법은 원하는 하위 오브젝트 (원하는 슬라이스)의 메모리에 새 사본을 리턴합니다.

그러나 팬더에는 인덱싱 규칙이있어이를 수행하지 않고 대신 원래 오브젝트의 하위 오브젝트 또는 슬라이스와 동일한 메모리 청크를 참조하는 새 변수를 제공합니다. 이는 두 번째 색인 작성 방법으로 발생하므로 copy()정기적 인 사본을 얻기 위해 함수를 사용하여 수정할 수 있습니다 . 이 경우 슬라이스 개체라고 생각되는 것을 변경하면 원래 개체가 변경 될 수 있습니다. 항상 조심해야합니다.

df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df

을 사용하려면 iloc열 위치 (또는 인덱스)를 알아야합니다. 하드 코딩 인덱스 대신 열 위치가 변경 될 수 있으므로 데이터 프레임 객체 의 메서드 기능 iloc과 함께 사용 하여 열 인덱스를 얻을 수 있습니다.get_loccolumns

{df.columns.get_loc(c):c for idx, c in enumerate(df.columns)}

이제이 사전을 사용하여 이름을 사용하고을 사용하여 열에 액세스 할 수 있습니다 iloc.


답변

버전 0.11.0부터는 인덱서를 사용하여 시도한 방식으로 열 슬라이스 할 수 있습니다.loc .

df.loc[:, 'C':'E']

~에 해당

df[['C', 'D', 'E']]  # or df.loc[:, ['C', 'D', 'E']]

C통해 열 을 반환합니다 E.


임의로 생성 된 DataFrame에 대한 데모 :

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
                  columns=list('ABCDEF'),
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out:
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

C에서 E로 열을 가져 오려면 정수 슬라이싱과 달리 열에 ‘E’가 포함되어 있습니다.

df.loc[:, 'C':'E']

Out:
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

레이블을 기반으로 행을 선택하는 것과 동일합니다. 해당 열에서 ‘R6’에서 ‘R10’행을 가져옵니다.

df.loc['R6':'R10', 'C':'E']

Out:
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc또한 부울 배열을 허용하므로 배열의 해당 항목이 인 열을 선택할 수 있습니다 True. 예를 들어 열 이름이 목록에 있으면 True를 df.columns.isin(list('BCD'))반환 array([False, True, True, True, False, False], dtype=bool)합니다 ['B', 'C', 'D']. 그렇지 않으면 거짓입니다.

df.loc[:, df.columns.isin(list('BCD'))]

Out:
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...


답변

열 이름 ( df.columns)이 이라고 가정하면 ['index','a','b','c']원하는 데이터는 세 번째 및 네 번째 열에 있습니다. 스크립트가 실행될 때 이름을 모르는 경우이 작업을 수행 할 수 있습니다

newdf = df[df.columns[2:4]] # Remember, Python is 0-offset! The "3rd" entry is at slot 2.

EMS가에서 지적한대로 그의 대답 , df.ix더 간결하게 열을 약간 슬라이스,하지만 .columns그것은 바닐라 1-D 파이썬 목록 색인 / 슬라이스 구문을 사용하기 때문에 슬라이스 인터페이스는 더 자연스러운 수 있습니다.

경고 : 열의 'index'이름이 잘못되었습니다 DataFrame. 동일한 레이블이 실제 df.index속성 인 Index배열 에도 사용 됩니다. 따라서 열이 반환되고 df['index']실제 DataFrame 색인이에 의해 반환됩니다 df.index. 은 Index특별한 종류의 Series그것의 요소의 값을 검색에 최적화 된. df.index의 경우 레이블로 행을 조회합니다. 해당 df.columns속성은 pd.Index레이블로 열을 조회하기위한 배열 이기도합니다 .


답변

In [39]: df
Out[39]:
   index  a  b  c
0      1  2  3  4
1      2  3  4  5

In [40]: df1 = df[['b', 'c']]

In [41]: df1
Out[41]:
   b  c
0  3  4
1  4  5


답변

나는이 질문이 상당히 오래되었다는 것을 알고 있지만 최신 버전의 팬더에는 정확하게 이것을 할 수있는 쉬운 방법이 있습니다. 열 이름 (문자열) 원하는 방식으로 슬라이스 할 수 있습니다.

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)


답변

제거 할 열 목록을 제공 drop()하고 Pandas DataFrame 의 함수를 사용하여 필요한 열만 사용하여 DataFrame을 다시 반환 할 수 있습니다 .

그냥 말

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

다만 열이있는 DataFrame을 반환 b하고 c.

drop방법은 여기 에 문서화되어 있습니다 .


답변

팬더와 함께

재치 열 이름

dataframe[['column1','column2']]

iloc 및 색인 번호가있는 특정 열로 선택하려면 다음을 수행하십시오.

dataframe.iloc[:,[1,2]]

로크 열 이름과 같이 사용할 수 있습니다

dataframe.loc[:,['column1','column2']]