답변:
짐작했듯이 올바른 구문은
del df['column_name']
del df.column_name
파이썬의 구문상의 한계로 인해 간단 하게 작업 하기가 어렵습니다 . 파이썬에 의해 표지 아래로 del df[name]
번역됩니다 df.__delitem__(name)
.
class A(object): def __init__(self): self.var = 1
수업을 시작한 다음 a = A(); del a.var
잘 작동합니다.
del df[name]
변환됩니다 df.__delitem__(name)
. 의 경우 del df.name
멤버 변수가 사용자 지정 코드를 실행할 가능성없이 제거됩니다. 자신의 예를 고려하십시오- del a.var
"삭제 변수"를 인쇄 할 수 있습니까? 가능하다면 방법을 알려주십시오. 난 못해 :)
pandas
개발자 는 그렇지 않았지만 그렇다고해서 어려운 것은 아닙니다.
팬더에서 이것을 수행하는 가장 좋은 방법은 다음을 사용하는 것입니다 drop
.
df = df.drop('column_name', 1)
축 번호 1
는 어디에 있습니까 ( 행과 열의 경우).0
1
재할 당하지 않고 열을 삭제하려면 df
다음을 수행하십시오.
df.drop('column_name', axis=1, inplace=True)
마지막으로 column label 대신 열 번호 를 기준 으로 삭제하려면 첫 번째, 두 번째 및 네 번째 열과 같이 삭제하십시오.
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)
del
어떤 이유로 이것이 권장 됩니까?
drop
오버 del
즉 drop
만약 (특히, 3-D 행렬 유용하거나 축을 따라 동작 인플레 이스의 여부, 또한 삭제 기록을 한 번에 여러 개의 열을 떨어 수행 할 수 Panel
)
사용하다:
columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)
하나 이상의 열이 제자리에서 삭제됩니다. 참고 inplace=True
팬더 추가되었다 V0.13 및 이전 버전에서 작동하지 않습니다. 이 경우 결과를 다시 할당해야합니다.
df = df.drop(columns, axis=1)
df.drop(list,inplace=True,axis=1)
del
. 한 번에 두 개 이상의 열을 삭제할 수 있습니다.
첫 번째, 두 번째 및 네 번째 열을 삭제하십시오.
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
df.T.pop('A')
df
. 당신 은 할 수 df = df.T; df.pop(index); df = df.T
있지만 이것은 과도한 것 같습니다.
df.drop(df.columns[[0]], axis=1, inplace=True)
사용하기에 충분하지 df.drop([0], axis=1)
않습니까?
0
, 다음 df.drop(0, axis=1)
잘 작동. 그러나 열 이름을 모르고 첫 번째 열을 제거한 다음 필요 df.drop(df.columns[[0]], axis=1, inplace=True)
하면 위치별로 첫 번째 열을 선택하고 삭제하십시오.
여기에 대부분의 대답으로 놓친 실제 질문은 다음과 같습니다.
del df.column_name
없습니까?처음에는 문제를 이해해야하는데,이를 위해서는 파이썬 매직 메소드 를 사용해야 합니다 .
Wes가 그의 답변에서 지적한 것처럼 열을 떨어 뜨리기 위해 팬더에서 구현 되는 del df['column']
python magic 방법에 매핑 됩니다.df.__delitem__('column')
그러나 파이썬 매직 메소드 에 대한 위의 링크에서 지적했듯이 :
사실,
__del__
그것이 불리한 불안정한 환경 때문에 거의 사용해서는 안됩니다. 조심해서 사용하십시오!
del df['column_name']
사용하거나 장려해서는 안된다고 주장 할 수 있으며 따라서 del df.column_name
고려해서는 안됩니다.
그러나 이론적으로 는 magic 방법을del df.column_name
사용 하여__delattr__
팬더에서 작동하도록 구현할 수 있습니다 . 그러나 이것은 특정 문제, del df['column_name']
구현에 이미 있지만 적은 정도의 문제를 유발합니다 .
"dtypes"또는 "columns"라는 데이터 프레임에 열을 정의하면 어떻게됩니까?
그런 다음이 열을 삭제한다고 가정합니다.
del df.dtypes
__delattr__
"dtypes"속성 또는 "dtypes"열을 삭제해야하는 것처럼 메소드를 혼란스럽게 만듭니다 .
.ix
, .loc
또는 .iloc
메소드를 사용할 수 있습니다 .del df.column_name
팬더는 이러한 종류의 인지 불협화음 이 사용자에게 발생하지 않도록 다시 생각 해야하는 상당히 자라 난 아키텍처를 가지고 있기 때문에 할 수 없습니다 .
df.column_name을 사용하지 마십시오. 예쁘지 만인지 부조화를 유발합니다.
열을 삭제하는 방법에는 여러 가지가 있습니다.
그것을하는 명백한 방법이 있어야합니다.
열은 때때로 속성이지만 때로는 그렇지 않습니다.
특별한 경우는 규칙을 어길만큼 특별하지 않습니다.
del df.dtypes
dtypes 속성 또는 dtypes 열을 삭제 합니까 ?
모호함에 직면하여 추측하려는 유혹을 거부하십시오.
__del__
불확실한 상황 때문에 사용해서는 안됩니다.주의해서 사용하십시오!" 여기서 사용되는 방법은이므로 여기와 완전히 관련이 없습니다 __delattr__
.
del
의미 내장이 아닌 .__del__
인스턴스 메소드. del
내부 명령에 매핑 __delattr__
하고 __delitem__
나는 내 주장을 구축하고있는 무슨이다. 아마 내가 쓴 것을 다시 읽고 싶을 것입니다.
__
... __
StackExchange에 의해 대담한 마크 업으로 해석됩니다
Pandas 버전 0.21은 및 메소드 의 서명과 일치하도록 및 매개 변수를 drop
모두 포함 하도록 메소드를 약간 변경했습니다 .index
columns
rename
reindex
df.drop(columns=['column_a', 'column_c'])
개인적으로 axis
매개 변수를 사용하여 열이나 인덱스를 나타내는 것이 거의 모든 팬더 방법에 사용되는 주요 키워드 매개 변수이기 때문에 선호 합니다. 그러나 이제 0.21 버전에서 몇 가지 선택 사항이 추가되었습니다.
좀 더 효율적인 솔루션을 찾기위한 많은 노력. 단순성을 희생하면서 추가 된 복잡성을 정당화하기 어려움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
A B C D E F G H I J
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')
A B C D E F G
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)
모두 다음으로 평가됩니다.
A B C D E F G
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]
모두 다음으로 평가됩니다.
A B C D E F G
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')
. 모든 노력을 기울인 후에는 성능이 약간 향상되는 것 같습니다.
사실 경우 최적의 솔루션을 사용 reindex
또는 reindex_axis
해킹에 list(set(df.columns.values.tolist()).difference(dlst))
. 가까운 두번째 여전히 매우 근소하게 더보다는 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 = df.drop([col1, col2, . . . , coln], axis=1)
col1, col2 등 대신 변수 이름을 지정하면 작동하지 않습니다. 정확히 존재하면 축에 오류 열이 표시되지 않습니다. @Littin 도와 드릴까요?
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으로 얻는 것만 큼 좋은 결과를 얻습니다.