Pandas DataFrame 删除元组或列列表

Posted

技术标签:

【中文标题】Pandas DataFrame 删除元组或列列表【英文标题】:Pandas DataFrame drop tuple or list of columns 【发布时间】:2018-01-25 22:28:23 【问题描述】:

当为pandas.DataFrame 使用drop 方法时,它接受列名列表,但不接受元组,尽管documentation 表示“list-like”参数是可以接受的。我是否错误地阅读了文档,因为我希望我的 MWE 能够工作。

MWE

import pandas as pd
df = pd.DataFrame(k: range(5) for k in list('abcd'))
df.drop(['a', 'c'], axis=1) # Works
df.drop(('a', 'c'), axis=1) # Errors

版本 - 使用 Python 2.7.12、Pandas 0.20.3。

【问题讨论】:

怎么样:df.drop(list(('a', 'c')), axis=1)? 我认为这是一个文档错误。 @MaxU,这就是我正在做的工作。 【参考方案1】:

元组选择Multiindex有问题:

np.random.seed(345)
mux = pd.MultiIndex.from_arrays([list('abcde'), list('cdefg')])

df = pd.DataFrame(np.random.randint(10, size=(4,5)), columns=mux)
print (df)
   a  b  c  d  e
   c  d  e  f  g
0  8  0  3  9  8
1  4  3  4  1  7
2  4  0  9  6  3
3  8  0  3  1  5

df = df.drop(('a', 'c'), axis=1)
print (df)
   b  c  d  e
   d  e  f  g
0  0  3  9  8
1  3  4  1  7
2  0  9  6  3
3  0  3  1  5

同:

df = df[('a', 'c')]
print (df)
0    8
1    4
2    4
3    8
Name: (a, c), dtype: int32

【讨论】:

【参考方案2】:

Pandas 将元组视为多索引值,因此请尝试以下操作:

In [330]: df.drop(list(('a', 'c')), axis=1)
Out[330]:
   b  d
0  0  0
1  1  1
2  2  2
3  3  3
4  4  4

这里是在多索引 DF 中删除 (axis=0 - 默认)的示例:

In [342]: x = df.set_index(np.arange(len(df), 0, -1), append=True)

In [343]: x
Out[343]:
     a  b  c  d
0 5  0  0  0  0
1 4  1  1  1  1
2 3  2  2  2  2
3 2  3  3  3  3
4 1  4  4  4  4

In [344]: x.drop((0,5))
Out[344]:
     a  b  c  d
1 4  1  1  1  1
2 3  2  2  2  2
3 2  3  3  3  3
4 1  4  4  4  4

In [345]: x.drop([(0,5), (4,1)])
Out[345]:
     a  b  c  d
1 4  1  1  1  1
2 3  2  2  2  2
3 2  3  3  3  3

所以当你指定tuple时,Pandas 会将其视为多索引标签

【讨论】:

以上是关于Pandas DataFrame 删除元组或列列表的主要内容,如果未能解决你的问题,请参考以下文章

【pandas笔记】删除DataFrame中特定所在的行或列

数据库查询学习心得

如何在 Python 中创建具有两列作为元组或 Pandas 数据框的单个变量?

将元组的无序列表转换为 pandas DataFrame

从大型元组/行列表中有效地构建 Pandas DataFrame

从大型元组/行列表中有效地构建 Pandas DataFrame