IT story

팬더에서 열 집합 선택 / 제외

hot-time 2020. 4. 16. 08:32
반응형

팬더에서 열 집합 선택 / 제외


이 질문에는 이미 답변이 있습니다.

열 선택을 기반으로 기존 데이터 프레임에서 뷰 또는 데이터 프레임을 만들고 싶습니다.

예를 들어 두 열을 제외한 모든 열을 보유 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으로 다시 읽었으며 이제 원하지 않는 열 ( BD)을 건너 뜁니다 .

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

반응형