Pandas drop方法表现不一致地丢弃NaN头

时间:2016-04-29 17:58:27

标签: python pandas ipython

我在尝试从表中删除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']

从这里我们可以看到C中的df1列在映射文件中没有条目,因此标题会替换为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列仍然存在。

2 个答案:

答案 0 :(得分:3)

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

  

当index是唯一的时,pandas使用哈希表将键映射到值。   当索引是非唯一且已排序时,pandas使用二进制搜索,   当索引是随机排序时,pandas需要检查所有的密钥   索引。

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

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]

答案 1 :(得分:0)

嗯...这可能被认为是一个错误,但如果您的列标有相同的标签,则会出现此问题,在本例中为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列时也会发生这种情况......