programing

판다 기둥 세트 선정/제외

sourcejob 2022. 9. 24. 10:20
반응형

판다 기둥 세트 선정/제외

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

예를 들어, 나는만들고 싶다 프레임을 데이턴dataframe 예를 들어 만들고 싶은가.df2한dataframe 데이터 프레임에서에서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']]

라고 하는 새로운 인덱스 메서드가 있습니다.인수가 제거된 상태로 전달된 열이 원래 열을 반환합니다.

여기, 그 결과 여기서 결과는열을제거하는 데 사용됩니다 열을 제거하는 데 사용됩니다.B ★★★★★★★★★★★★★★★★★」D부터에서df::

df2 = df[df.columns.difference(['B', 'D'])]

이 방법은 집합 기반 방식이기 때문에 열 이름이 중복되면 문제가 발생하고 열 순서가 변경될 수 있습니다.


우위점drop겨우 열 목록을 필요로 합니다:전체 dataframe의 사본을 만들지 않습니다.:열 목록만 필요한 경우 전체 데이터 프레임의 복사본을 만들지 않습니다.예를 들어, 위해 기둥의 부분 집합에 중복하려면 을 사용합니다.예를 들어, 열의 하위 집합에서 중복을 삭제하려면 다음과 같이 하십시오.

# may create a copy of the dataframe
subset = df.drop(['B', 'D'], axis=1).columns

# does not create a copy the dataframe
subset = df.columns.difference(['B', 'D'])

df = df.drop_duplicates(subset=subset)

루프에서 드롭 또는 필터링을 하지 않는 다른 옵션:

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'])]]

# or even simpler since 0.24
# with the caveat that it reorders columns alphabetically 
df[df.columns.difference(['C', 'D'])]

실제로 이를 세트로 변환할 필요는 없습니다.

cols = [col for col in df.columns if col not in ['B', 'D']]
df2 = df[cols]

또, 빌트인 기능에 대해서도 확인해 주세요.

최소적이지만 탐욕스러운 접근법(지정된 df에 충분):

df.filter(regex="[^BD]")

보수적인/느긋한 접근법(정확한 일치만):

df.filter(regex="^(?!(B|D)$).*$")

보수적 및 범용:

exclude_cols = ['B','C']
df.filter(regex="^(?!({0})$).*$".format('|'.join(exclude_cols)))

열 A, B, C, D가 4개 있습니다.

새 데이터 프레임에 필요한 열을 선택하는 더 좋은 방법은 다음과 같습니다.

df2 = df1[['A','D']]

대신 열 번호를 사용하려면 다음을 사용하십시오.

df2 = df1[[0,3]]

그냥 데이터를하면 됩니다 변환만 당신의가 모든 바꿔야 합니다.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]

다음은 의 복사본을 만드는 방법입니다.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의 메서드에도 해당됩니다.(그 메서드는 멋지고 매끄럽고 피토닉하지만).난 안 쓰러뜨릴 거야!!

뷰 대 복사본에 대한 자세한 내용은 이 SO 답변과 이 답변이 참조하는 판다 문서의 이 부분참조하십시오.

마찬가지로 파일을 읽을 때 불필요한 데이터를 메모리로 낭비하여 읽고 나중에 폐기하는 것이 아니라 미리 열을 제외하는 것이 좋습니다.

팬더 0.20.0을 기점으로, 현재는 1캘러블을 받아들입니다.이 업데이트를 통해 열을 보다 유연하게 읽을 수 있습니다.

skipcols = [...]
read_csv(..., usecols=lambda x: x not in skipcols)

후자의 패턴은 본질적으로 전통적인 패턴의 반대이다.usecolsmethod - 지정된 열만 건너뜁니다.


정해진

파일 내의 데이터

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
...

세부 사항

Data Frame이 파일에 입력되었습니다.그런 다음 별도의 DataFrame으로 다시 읽혀졌고 이제 불필요한 열을 건너뜁니다.B그리고.D).

OP의 경우 데이터가 이미 생성되어 있기 때문에 기존 객체에서 불필요한 열을 삭제하는 것이 더 나은 방법입니다.그러나 여기서 설명하는 기술은 파일에서 DataFrame으로 직접 데이터를 읽을 때 가장 유용합니다.

이 문제에서 "skipcols" 옵션에 대한 요청이 제기되었으며 이후 문제에서 해결되었습니다.

언급URL : https://stackoverflow.com/questions/14940743/selecting-excluding-sets-of-columns-in-pandas

반응형