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