按索引删除多个 Pandas 列
Posted
技术标签:
【中文标题】按索引删除多个 Pandas 列【英文标题】:Dropping multiple Pandas columns by Index 【发布时间】:2019-01-16 20:35:21 【问题描述】:我有一个大熊猫数据框(>100 列)。我需要删除各种列,我希望有一种使用旧的方法
df.drop(df.columns['slices'],axis=1)
我已经建立了选择,例如:
a = df.columns[3:23]
b = df.colums[-6:]
a
和 b
代表我要删除的列集。
以下
list(df)[3:23]+list(df)[-6:]
产生正确的选择,但我无法用drop
实现它:
df.drop(df.columns[list(df)[3:23]+list(df)[-6:]],axis=1)
ValueError: 操作数不能与形状一起广播 (20,) (6,)
我环顾四周,但无法得到答案。
Selecting last n columns and excluding last n columns in dataframe
(以下与我收到的错误有关):
python numpy ValueError: operands could not be broadcast together with shapes
这个感觉就像他们遇到了类似的问题,但“切片”并不是分开的: Deleting multiple columns based on column names in Pandas
干杯
【问题讨论】:
试试df.drop(columns=list(df)[3:23]+list(df)[-6:])
这也很有效——像往常一样,给猫剥皮的方法不止一种。这更符合我想要达到的目标,非常感谢。
【参考方案1】:
您可以使用np.r_
无缝组合多个范围/切片:
from string import ascii_uppercase
df = pd.DataFrame(columns=list(ascii_uppercase))
idx = np.r_[3:10, -5:0]
print(idx)
array([ 3, 4, 5, 6, 7, 8, 9, -5, -4, -3, -2, -1])
然后您可以使用idx
为您的列编制索引并提供给pd.DataFrame.drop
:
df.drop(df.columns[idx], axis=1, inplace=True)
print(df.columns)
Index(['A', 'B', 'C', 'K', 'L', 'M', 'N',
'O','P', 'Q', 'R', 'S', 'T', 'U'], dtype='object')
【讨论】:
我以为切片组合会有一些 np 函数,但我找不到。干杯 我发现需要定义列表切片的末尾([-n:0]
中的 0),但我想我现在明白了。再次感谢!【参考方案2】:
这将返回删除列的数据框
df.drop(list(df)[2:5], axis=1)
【讨论】:
【参考方案3】:您可以使用这个简单的解决方案:
cols = [3,7,10,12,14,16,18,20,22]
df.drop(df.columns[cols],axis=1,inplace=True)
结果:
0 1 2 4 5 6 8 9 11 13 15 17 19 21
0 3 12 10 3 2 1 7 512 64 1024.0 -1.0 -1.0 -1.0 -1.0
1 5 12 10 3 2 1 7 16 2 32.0 32.0 1024.0 -1.0 -1.0
2 5 12 10 3 2 1 7 512 2 32.0 32.0 32.0 -1.0 -1.0
3 5 12 10 3 2 1 7 16 1 32.0 64.0 1024.0 -1.0 -1.0
如您所见,具有给定索引的列已全部删除。
如果我们假设您有 A、B、C ...等,您可以用数组中列的名称替换 int 值,您可以像这样替换 cols
中的 int 值,例如:
cols = ['A','B','C','F']
【讨论】:
【参考方案4】:IIUC:
a = df.columns[3:23].values.tolist()
b = df.colums[-6:].values.tolist()
a.extend(b)
df.drop(a,1,inplace=True)
【讨论】:
【参考方案5】:我之前遇到过类似的问题并且遇到了麻烦,但通过从另一个“减去”一个df来解决它,不确定这是否对你有用,但它对我有用:
df = df[~df.index.isin(a.index)]
df = df[~df.index.isin(b.index)]
【讨论】:
以上是关于按索引删除多个 Pandas 列的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用read_csv函数读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用方括号[]基于最外层列索引名称索引列数据
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用方括号[]基于列索引名称元组索引列数据(index tuple)