DataFrame에서 열을 삭제할 때 다음을 사용합니다.
del df['column_name']
그리고 이것은 훌륭하게 작동합니다. 다음을 사용할 수 없는 이유는 무엇입니까?
del df.column_name
df.column_name
으로 액세스할 수 있기 때문에 이것이 작동할 것으로 예상했습니다.
질문자 :John
DataFrame에서 열을 삭제할 때 다음을 사용합니다.
del df['column_name']
그리고 이것은 훌륭하게 작동합니다. 다음을 사용할 수 없는 이유는 무엇입니까?
del df.column_name
df.column_name
으로 액세스할 수 있기 때문에 이것이 작동할 것으로 예상했습니다.
Pandas에서 이를 수행하는 가장 좋은 방법은 drop
을 사용하는 것입니다.
df = df.drop('column_name', 1)
여기서 1
은 축 번호입니다( 0
, 열은 1
).
df
를 재할당하지 않고 열을 삭제하려면 다음을 수행하십시오.
df.drop('column_name', axis=1, inplace=True)
마지막으로 열 레이블 대신 열 번호 로 삭제하려면 첫 번째, 두 번째 및 네 번째 열과 같이 삭제를 시도하십시오.
df = df.drop(df.columns[[0, 1, 3]], axis=1) # df.columns is zero-based pd.Index
또한 열에 대한 "텍스트" 구문으로 작업:
df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True)
참고: v0.21.0 (2017년 10월 27일)에 도입된 drop() 메서드는 축을 지정하는 대신 인덱스/열 키워드를 허용합니다.
이제 다음과 같이 할 수 있습니다.
df = df.drop(columns=['column_nameA', 'column_nameB'])
짐작하신 대로 올바른 구문은
del df['column_name']
del df.column_name
이 단순히 Python의 구문 제한의 결과로 작동하도록 하는 것은 어렵습니다. del df[name]
은 Python에 의해 df.__delitem__(name)
으로 번역됩니다.
사용하다:
columns = ['Col1', 'Col2', ...] df.drop(columns, inplace=True, axis=1)
이렇게 하면 하나 이상의 열이 제자리에서 삭제됩니다. inplace=True
는 pandas v0.13에 추가되었으며 이전 버전에서는 작동하지 않습니다. 이 경우 결과를 다시 할당해야 합니다.
df = df.drop(columns, axis=1)
첫 번째, 두 번째 및 네 번째 열 삭제:
df.drop(df.columns[[0,1,3]], axis=1, inplace=True)
첫 번째 열 삭제:
df.drop(df.columns[[0]], axis=1, inplace=True)
선택적 매개 변수가 inplace
원래의 데이터 복사본을 만들지 않고 수정 될 수 있도록.
열 column-name
삭제:
df.pop('column-name')
df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])
print df
:
one two three A 1 2 3 B 4 5 6 C 7 8 9
df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:
two three A 2 3 B 5 6 C 8 9
three = df.pop('three')
print df
:
two A 2 B 5 C 8
대부분의 답변에서 놓친 실제 질문은 다음과 같습니다.
del df.column_name
사용할 수 없는 이유는 무엇입니까?처음에 우리는 문제를 이해해야 하며, 이를 위해서는 Python의 매직 메소드 에 뛰어들어야 합니다.
Wes가 그의 답변에서 지적했듯이 del df['column']
은 Pandas에서 구현되어 column 을 삭제하는 Python 매직 메서드 df.__delitem__('column')
매핑됩니다.
그러나 Python 매직 메소드 에 대한 위의 링크에서 지적했듯이 :
사실,
__del__
은 호출되는 불안정한 상황 때문에 거의 사용되지 않아야 합니다. 주의해서 사용하십시오!
del df['column_name']
을 사용하거나 권장 del df.column_name
을 고려하지도 말아야 한다고 주장할 수 있습니다.
그러나 이론적으로 del df.column_name
은 마법의 메서드 __delattr__
사용하여 Pandas에서 작동하도록 구현될 수 있습니다. del df['column_name']
구현이 이미 가지고 있지만 그 정도는 낮은 특정 문제를 야기합니다.
"dtypes" 또는 "columns"라는 데이터 프레임에 열을 정의하면 어떻게 됩니까?
그런 다음 이 열을 삭제한다고 가정합니다.
del df.dtypes
는 "dtypes" 속성이나 "dtypes" 열을 삭제해야 하는 것처럼 __delattr__
메서드를 혼동하게 만듭니다.
.ix
, .loc
또는 .iloc
메서드를 사용할 수 있습니다. del df.column_name
수행할 수 없습니다. Pandas는 사용자에게 이러한 종류의 인지 부조화 가 발생하지 않도록 재고해야 하는 상당히 성장한 아키텍처를 가지고 있기 때문입니다.
df.column_name을 사용하지 마십시오. 그것은 아름다울 수 있지만 인지 부조화를 일으킵니다.
열을 삭제하는 방법에는 여러 가지가 있습니다.
그것을 할 수 있는 확실한 방법이 하나 있어야 하고 가급적이면 하나만 있어야 합니다.
열은 때로는 속성이지만 때로는 그렇지 않습니다.
특별한 경우는 규칙을 어길 만큼 특별하지 않습니다.
del df.dtypes
는 dtypes 속성이나 dtypes 열을 삭제합니까?
모호함에 직면하여 추측하려는 유혹을 거부하십시오.
열이 있는 경우에만 열 을 삭제할 수 있는 기능이 추가되었습니다. 이렇게 하면 더 많은 사용 사례를 다룰 수 있으며 전달된 레이블에서 기존 열만 삭제됩니다.
예를 들어 errors='ignore' 를 추가하기만 하면 됩니다.
df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
버전 0.16.1부터 다음을 수행할 수 있습니다.
df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')
[]
표기법을 사용하는 것이 좋습니다. 한 가지 이유는 속성 표기법( df.column_name
)이 번호가 매겨진 인덱스에 대해 작동하지 않기 때문입니다.
In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]]) In [2]: df[1] Out[2]: 0 2 1 5 Name: 1 In [3]: df.1 File "<ipython-input-3-e4803c0d1066>", line 1 df.1 ^ SyntaxError: invalid syntax
Pandas 버전 0.21은 rename
및 재 reindex
방법의 서명과 일치하도록 index
및 columns
drop
방법을 약간 변경했습니다.
df.drop(columns=['column_a', 'column_c'])
axis
매개변수를 사용하여 열이나 인덱스를 표시하는 것을 선호합니다. 왜냐하면 이것은 거의 모든 pandas 메소드에서 사용되는 주요 키워드 매개변수이기 때문입니다. 그러나 이제 버전 0.21에 몇 가지 선택 사항이 추가되었습니다.
Pandas 0.16.1+에서는 eiTan LaVi가 게시한 솔루션에 따라 열이 있는 경우에만 열을 삭제할 수 있습니다. 해당 버전 이전에는 조건부 목록 이해를 통해 동일한 결과를 얻을 수 있습니다.
df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], axis=1, inplace=True)
사용하다:
df.drop('columnname', axis =1, inplace = True)
아니면 당신과 함께 갈 수 있습니다
del df['colname']
열 번호를 기준으로 여러 열을 삭제하려면
df.drop(df.iloc[:,1:3], axis = 1, inplace = True)
열 이름을 기반으로 여러 열을 삭제하려면
df.drop(['col1','col2',..'coln'], axis = 1, inplace = True)
조금 더 효율적인 솔루션을 찾기 위한 많은 노력. df.drop(dlst, 1, errors='ignore')
의 단순성을 희생하면서 추가된 복잡성을 정당화하기 어렵습니다.
df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1)
전문
열을 삭제하는 것은 다른 열을 선택하는 것과 의미상 동일합니다. 고려해야 할 몇 가지 추가 방법을 보여 드리겠습니다.
또한 한 번에 여러 열을 삭제하고 존재하지 않는 열을 삭제하려는 시도를 허용하는 일반적인 솔루션에 중점을 둘 것입니다.
이러한 솔루션을 사용하는 것은 일반적이며 간단한 경우에도 작동합니다.
설정
pd.DataFrame
df
dlst
를 삭제할 목록을 고려하십시오.
df = pd.DataFrame(dict(zip('ABCDEFGHIJ', range(1, 11))), range(3)) dlst = list('HIJKLM')
df ABCDEFGHIJ 0 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 1 2 3 4 5 6 7 8 9 10
dlst ['H', 'I', 'J', 'K', 'L', 'M']
결과는 다음과 같아야 합니다.
df.drop(dlst, 1, errors='ignore') ABCDEFG 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7
한 열을 삭제하는 것과 다른 열을 선택하는 것과 동일하므로 두 가지 유형으로 나누겠습니다.
삭제하려는 열 없이 유지하려는 열을 나타내는 레이블 목록/배열을 제조하는 것으로 시작합니다.
df.columns.difference(dlst)
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
np.setdiff1d(df.columns.values, dlst)
array(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype=object)
df.columns.drop(dlst, errors='ignore')
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
list(set(df.columns.values.tolist()).difference(dlst))
# does not preserve order ['E', 'D', 'B', 'F', 'G', 'A', 'C']
[x for x in df.columns.values.tolist() if x not in dlst]
['A', 'B', 'C', 'D', 'E', 'F', 'G']
레이블의 열
선택 프로세스를 비교하기 위해 다음을 가정합니다.
cols = [x for x in df.columns.values.tolist() if x not in dlst]
그런 다음 평가할 수 있습니다.
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
모두 다음으로 평가됩니다.
ABCDEFG 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7
슬라이싱을 위한 부울 배열/목록을 구성할 수 있습니다.
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
부울의 열
비교를 위해
bools = [x not in dlst for x in df.columns.values.tolist()]
df.loc[: bools]
모두 다음으로 평가됩니다.
ABCDEFG 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7
강력한 타이밍
기능
setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst) difference = lambda df, dlst: df.columns.difference(dlst) columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore') setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst)) comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst] loc = lambda df, cols: df.loc[:, cols] slc = lambda df, cols: df[cols] ridx = lambda df, cols: df.reindex(columns=cols) ridxa = lambda df, cols: df.reindex_axis(cols, 1) isin = lambda df, dlst: ~df.columns.isin(dlst) in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst) comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()] brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1)
테스트
res1 = pd.DataFrame( index=pd.MultiIndex.from_product([ 'loc slc ridx ridxa'.split(), 'setdiff1d difference columndrop setdifflst comprehension'.split(), ], names=['Select', 'Label']), columns=[10, 30, 100, 300, 1000], dtype=float ) res2 = pd.DataFrame( index=pd.MultiIndex.from_product([ 'loc'.split(), 'isin in1d comp brod'.split(), ], names=['Select', 'Label']), columns=[10, 30, 100, 300, 1000], dtype=float ) res = res1.append(res2).sort_index() dres = pd.Series(index=res.columns, name='drop') for j in res.columns: dlst = list(range(j)) cols = list(range(j // 2, j + j // 2)) d = pd.DataFrame(1, range(10), cols) dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100) for s, l in res.index: stmt = '{}(d, {}(d, dlst))'.format(s, l) setp = 'from __main__ import d, dlst, {}, {}'.format(s, l) res.at[(s, l), j] = timeit(stmt, setp, number=100) rs = res / dres
rs 10 30 100 300 1000 Select Label loc brod 0.747373 0.861979 0.891144 1.284235 3.872157 columndrop 1.193983 1.292843 1.396841 1.484429 1.335733 comp 0.802036 0.732326 1.149397 3.473283 25.565922 comprehension 1.463503 1.568395 1.866441 4.421639 26.552276 difference 1.413010 1.460863 1.587594 1.568571 1.569735 in1d 0.818502 0.844374 0.994093 1.042360 1.076255 isin 1.008874 0.879706 1.021712 1.001119 0.964327 setdiff1d 1.352828 1.274061 1.483380 1.459986 1.466575 setdifflst 1.233332 1.444521 1.714199 1.797241 1.876425 ridx columndrop 0.903013 0.832814 0.949234 0.976366 0.982888 comprehension 0.777445 0.827151 1.108028 3.473164 25.528879 difference 1.086859 1.081396 1.293132 1.173044 1.237613 setdiff1d 0.946009 0.873169 0.900185 0.908194 1.036124 setdifflst 0.732964 0.823218 0.819748 0.990315 1.050910 ridxa columndrop 0.835254 0.774701 0.907105 0.908006 0.932754 comprehension 0.697749 0.762556 1.215225 3.510226 25.041832 difference 1.055099 1.010208 1.122005 1.119575 1.383065 setdiff1d 0.760716 0.725386 0.849949 0.879425 0.946460 setdifflst 0.710008 0.668108 0.778060 0.871766 0.939537 slc columndrop 1.268191 1.521264 2.646687 1.919423 1.981091 comprehension 0.856893 0.870365 1.290730 3.564219 26.208937 difference 1.470095 1.747211 2.886581 2.254690 2.050536 setdiff1d 1.098427 1.133476 1.466029 2.045965 3.123452 setdifflst 0.833700 0.846652 1.013061 1.110352 1.287831
fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True) for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]): ax = axes[i // 2, i % 2] g.plot.bar(ax=ax, title=n) ax.legend_.remove() fig.tight_layout()
df.drop(dlst, 1, errors='ignore')
를 실행하는 데 걸리는 시간과 관련이 있습니다. 그 모든 노력 끝에 우리는 성능을 약간만 향상시키는 것 같습니다.
사실 최고의 솔루션 list(set(df.columns.values.tolist()).difference(dlst))
reindex
또는 reindex_axis
를 사용합니다. 가까운 두 번째이며 여전히 drop
보다 약간 더 나은 것은 np.setdiff1d
입니다.
rs.idxmin().pipe( lambda x: pd.DataFrame( dict(idx=x.values, val=rs.lookup(x.values, x.index)), x.index ) ) idx val 10 (ridx, setdifflst) 0.653431 30 (ridxa, setdifflst) 0.746143 100 (ridxa, setdifflst) 0.816207 300 (ridx, setdifflst) 0.780157 1000 (ridxa, setdifflst) 0.861622
drop() 메서드를 사용 하여 지정된 열 또는 지정된 열을 제거 하거나 삭제할 수 있습니다.
df 가 데이터 프레임이라고 가정합니다.
제거할 열 = column0
암호:
df = df.drop(column0, axis=1)
여러 열을 제거하려면 col1, col2, . . . , coln, 제거해야 하는 모든 열을 목록에 삽입해야 합니다. 그런 다음 drop() 메서드로 제거합니다.
암호:
df = df.drop([col1, col2, . . . , coln], axis=1)
원본 데이터 프레임 df
가 너무 크지 않은 경우 메모리 제약이 없고 몇 개의 열만 유지하면 됩니다. 또는 필요하지 않은 모든 추가 열의 이름을 미리 알지 못하는 경우 다음을 수행합니다. 필요한 열만 사용하여 새 데이터 프레임을 만들 수도 있습니다.
new_df = df[['spam', 'sausage']]
점 구문은 JavaScript에서 작동하지만 Python에서는 작동하지 않습니다.
del df['column_name']
del df['column_name']
또는 del df.column_name
컬럼은 USING 삭제 iloc
의 기능 dataframe
과 slicing
우리가 원하지 않는 값을 갖는 전형적인 열 이름을 가질 때를 :
df = df.iloc[:,1:] # Removing an unnamed index column
여기서 0
은 기본 행이고 1
은 첫 번째 열이므로 :,1:
은 첫 번째 열을 삭제하기 위한 매개변수입니다.
Pandas DataFrame에서 열을 삭제하는 또 다른 방법
내부 삭제를 찾고 있지 않다면 다음과 같이 DataFrame(...)
함수를 사용하여 열을 지정하여 새 DataFrame을 만들 수 있습니다.
my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']} df = pd.DataFrame(my_dict)
다음과 같이 새 DataFrame을 만듭니다.
newdf = pd.DataFrame(df, columns=['name', 'age'])
del / drop으로 얻은 결과만큼 좋은 결과를 얻습니다.
출처 : http:www.stackoverflow.com/questions/13411544/delete-a-column-from-a-pandas-dataframe
문자열에 0을 채우는 방법은 무엇입니까? (0) | 2022.01.04 |
---|---|
JSP 2를 사용하여 JSP 파일에서 Java 코드를 피하려면 어떻게 해야 합니까? (0) | 2022.01.04 |
임의의 문자열을 사용하는 이 코드가 "hello world"를 인쇄하는 이유는 무엇입니까? (0) | 2022.01.04 |
두 가지 다른 지점의 파일을 비교하는 방법 (0) | 2022.01.02 |
++[[]][+[]]+[+[]]가 문자열 "10"을 반환하는 이유는 무엇입니까? (0) | 2022.01.02 |