Pandas drop方法在丢弃NaN标头时表现不一致



我在尝试从表中删除nan列时遇到问题。

下面是一个按预期工作的示例:

import pandas as pd
import numpy as np
df1 = pd.DataFrame([[1, 2, 3], [4, 5, 6]], 
                    columns=['A', 'B', 'C'], 
                    index=['Foo', 'Bar'])
mapping1 = pd.DataFrame([['a', 'x'], ['b', 'y']], 
                        index=['A', 'B'], 
                        columns=['Test', 'Control'])
# rename the columns using the mapping file
df1.columns = mapping1.loc[df1.columns, 'Test']

从这里我们可以看到,df1中的C列在映射文件中没有条目,因此标头被nan替换。

# drop the nan column
df1.drop(np.nan, axis=1)

在这种情况下,调用np.nan会找到最后一个标头并将其丢弃

但是,在以下情况下,df.drop不起作用:

# set up table
sample1 = np.random.randint(0, 10, size=3)
sample2 = np.random.randint(0, 5, size=3)
df2 = pd.DataFrame([sample1, sample2], 
                   index=['sample1', 'sample2'], 
                   columns=range(3))
mapping2 = pd.DataFrame(['foo']*2, index=range(2), 
                        columns=['test'])
# assign columns using mapping file
df2.columns = mapping2.loc[df2.columns, 'test']
# try and drop the nan column
df2.drop(np.nan, axis=1)

并且保留nan列。

这可能是一个答案(来自https://stackoverflow.com/a/16629125/5717589):

当索引是唯一的时,panda使用哈希表将键映射到值。当索引是非唯一和排序时,Panda使用二进制搜索,当索引是随机排序时,熊猫需要检查指数

所以,如果条目是唯一的,我认为np.nan会被散列。在非唯一的情况下,Panda比较值,但是:

np.nan == np.nan
Out[1]: False

更新

我想通过标签访问NaN列是不可能的。但根据指数位置,这是可行的。以下是删除带有空标签的列的解决方法:

notnull_col_idx = np.arange(len(df.columns))[~pd.isnull(df.columns)]
df = df.iloc[:, notnull_col_idx]

嗯。。。这可能被认为是一个错误,但如果您的列被标记为相同的标签,在本例中为foo,则似乎会出现此问题。如果我切换标签,问题就会消失:

mapping2 = pd.DataFrame(['foo','boo'], index=range(2), 
                        columns=['test'])

我还试图通过列的索引位置来调用它们,但问题仍然存在:

# try and drop the nan column
df2.drop(df2.columns[[2]], axis=1)
Out[176]:
test    foo foo nan
sample1 4   4   4
sample2 4   0   1

但在将第二列标签更改为foo以外的其他内容后,问题自行解决。我最好的建议是要有独特的专栏标签。

其他信息:因此,当有多个nan列时也会发生这种情况。。。

最新更新