판다 기둥 세트 선정/제외
열 선택에 따라 기존 데이터 프레임에서 뷰 또는 데이터 프레임을 만들고 싶습니다.
예를 들어, 나는만들고 싶다 프레임을 데이턴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
'programing' 카테고리의 다른 글
| Python에 라벨/goto가 있나요? (0) | 2022.09.24 |
|---|---|
| Python에서 일반적인 bash idiod를 구현하려면 어떻게 해야 합니까? (0) | 2022.09.24 |
| xampp에서 mysql 버전을 업데이트하는 방법(innodb_additional_mem_pool_size 오류) (0) | 2022.09.23 |
| brk() 시스템콜의 역할은 무엇입니까? (0) | 2022.09.23 |
| 명령줄에서 PHP 코드를 실행하려면 어떻게 해야 합니까? (0) | 2022.09.23 |