我在尝试从表中删除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
列时也会发生这种情况。。。