Answers:
如您所料,正确的语法是
del df['column_name']
del df.column_name
仅由于Python的语法限制而使工作变得困难。del df[name]
被df.__delitem__(name)
Python掩盖。
class A(object): def __init__(self): self.var = 1
开设一堂课,然后a = A(); del a.var
就可以了...
del df[name]
,它将转换为df.__delitem__(name)
DataFrame可以实现和修改其需求的方法。在的情况下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)
最后,要按列号而不是按列标签删除,请尝试将其删除,例如第一,第二和第四列:
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
已在pandas 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
?首先,我们需要了解问题,这需要我们深入研究Python魔术方法。
正如Wes在他的答案中指出的那样,它del df['column']
映射到python 魔术方法 df.__delitem__('column')
,该方法在熊猫中实现以删除列
但是,正如上面有关python魔术方法的链接所指出的:
实际上,
__del__
由于调用它的不稳定环境,几乎不应该使用它;谨慎使用!
您可能会认为del df['column_name']
不应使用或鼓励这样做,因此del df.column_name
甚至不应考虑。
然而,从理论上讲,del df.column_name
可以Implemeted一个工作中使用熊猫的魔术方法__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解释为粗体标记
始终使用该[]
符号是个好习惯。原因之一是属性符号(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
寻找一点点更有效的解决方案需要付出很多努力。难以证明增加的复杂性,同时又牺牲了简单性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获得的结果一样好