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 数据框的单个变量?