팬더에서 열 집합 선택 / 제외
이 질문에는 이미 답변이 있습니다.
열 선택을 기반으로 기존 데이터 프레임에서 뷰 또는 데이터 프레임을 만들고 싶습니다.
예를 들어 두 열을 제외한 모든 열을 보유 df2
하는 데이터 프레임 에서 데이터 프레임을 만들고 싶습니다 df1
. 다음을 시도했지만 작동하지 않았습니다.
import numpy as np
import pandas as pd
# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# Try to create a second dataframe df2 from df with all columns except 'B' and D
my_cols = set(df.columns)
my_cols.remove('B').remove('D')
# This returns an error ("unhashable type: set")
df2 = df[my_cols]
내가 무엇을 잘못하고 있지? 아마도 더 일반적으로 팬더는 데이터 프레임에서 임의의 열 집합의 선택 및 제외 를 지원 해야하는 메커니즘은 무엇 입니까?
필요하지 않은 열을 삭제하거나 필요한 열을 선택할 수 있습니다
# Using DataFrame.drop
df.drop(df.columns[[1, 2]], axis=1, inplace=True)
# drop by Name
df1 = df1.drop(['B', 'C'], axis=1)
# Select the ones you want
df1 = df[['a','d']]
라는 새로운 색인 메소드가 difference
있습니다. 인수로 전달 된 열이 제거 된 원래 열을 리턴합니다.
df2 = df[df.columns.difference(['B', 'D'])]
여기서, 출력 열 걸러 사용 B
하고 D
부터 df
.
실제로 세트로 변환 할 필요는 없습니다.
cols = [col for col in df.columns if col not in ['B', 'D']]
df2 = df[cols]
루프에서 삭제하거나 필터링하지 않는 다른 옵션 :
import numpy as np
import pandas as pd
# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# include the columns you want
df[df.columns[df.columns.isin(['A', 'B'])]]
# or more simply include columns:
df[['A', 'B']]
# exclude columns you don't want
df[df.columns[~df.columns.isin(['C','D'])]]
내장 DataFrame.filter
기능도 살펴보십시오 .
최소한이지만 탐욕스러운 접근 방식 (주어진 df에 충분 함) :
df.filter(regex="[^BD]")
보수적 / 게으른 접근 (정확한 일치 만) :
df.filter(regex="^(?!(B|D)$).*$")
보수적이고 일반적인 :
exclude_cols = ['B','C']
df.filter(regex="^(?!({0})$).*$".format('|'.join(exclude_cols)))
당신은 단지로 변환해야 set
합니다list
import pandas as pd
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
my_cols = set(df.columns)
my_cols.remove('B')
my_cols.remove('D')
my_cols = list(my_cols)
df2 = df[my_cols]
여기 만드는 방법은 사본 (A)의 DataFrame
열 제외 목록 :
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
df2 = df.drop(['B', 'D'], axis=1)
그러나 조심하십시오! 귀하의 질문에 대한 견해에 대해 언급 df
했는데, df2
변경 한 경우에도 변경 하고 싶다는 제안입니다 . (보기는 데이터베이스에서와 같이)
이 방법으로는 달성 할 수 없습니다 :
>>> df.loc[0, 'A'] = 999 # Change the first value in df
>>> df.head(1)
A B C D
0 999 -0.742688 -1.980673 -0.920133
>>> df2.head(1) # df2 is unchanged. It's not a view, it's a copy!
A C
0 0.251262 -1.980673
@piggybox의 방법에서도 마찬가지입니다. (그 방법은 훌륭하고 매끄럽고 Pythonic이지만. 나는 그것을하지 않습니다!)
뷰 대 사본에 대한 자세한 내용은 이 SO 답변 과 해당 답변이 참조 하는 Pandas 문서 의이 부분을 참조하십시오 .
비슷한 맥락에서, 파일을 읽을 때 불필요한 데이터를 메모리에서 낭비 적으로 읽은 다음 나중에 버리지 않고 열을 미리 배제 할 수 있습니다.
팬더 0.20.0 usecols
부터는 callables를 허용 합니다. 1 이 업데이트를 사용하면 열을보다 유연하게 읽을 수 있습니다.
skipcols = [...]
read_csv(..., usecols=lambda x: x not in skipcols)
후자의 패턴은 기본적으로 기존 usecols
방법 과 반대이며 지정된 열만 건너 뜁니다.
주어진
파일의 데이터
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
filename = "foo.csv"
df.to_csv(filename)
암호
skipcols = ["B", "D"]
df1 = pd.read_csv(filename, usecols=lambda x: x not in skipcols, index_col=0)
df1
산출
A C
0 0.062350 0.076924
1 -0.016872 1.091446
2 0.213050 1.646109
3 -1.196928 1.153497
4 -0.628839 -0.856529
...
세부
DataFrame이 파일에 작성되었습니다. 그런 다음 별도의 DataFrame으로 다시 읽었으며 이제 원하지 않는 열 ( B
및 D
)을 건너 뜁니다 .
OP의 상황에서는 데이터가 이미 작성되었으므로 더 나은 접근 방법이 허용되는 답변이며, 기존 오브젝트에서 원하지 않는 열을 삭제합니다. 그러나 여기에 제시된 기술은 파일에서 DataFrame으로 데이터를 직접 읽을 때 가장 유용합니다.
이 문제 에서 "skipcols"옵션에 대한 요청이 제기되었으며 이후 문제에서 해결되었습니다 .
A, B, C, D 열이 4 개 있습니다
새 데이터 프레임에 필요한 열을 선택하는 더 좋은 방법은 다음과 같습니다.
df2 = df1[['A','D']]
대신 열 번호를 사용하려면 다음을 사용하십시오.
df2 = df1[[0,3]]
참고 URL : https://stackoverflow.com/questions/14940743/selecting-clude-sets-of-columns-in-pandas
'IT story' 카테고리의 다른 글
드래그하는 동안 입력 유형 = 범위의 onchange 이벤트가 firefox에서 트리거되지 않습니다 (0) | 2020.04.17 |
---|---|
ng-app와 data-ng-app의 차이점은 무엇입니까? (0) | 2020.04.17 |
Python 응용 프로그램에서 전송 한 전체 HTTP 요청을 어떻게 볼 수 있습니까? (0) | 2020.04.16 |
네임 스페이스 란 무엇입니까? (0) | 2020.04.16 |
WiX 설치 프로그램 업그레이드를 구현하는 방법은 무엇입니까? (0) | 2020.04.16 |