当我有这样的数据框时:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.nan, index=list('abc'), columns=list('DEF'), dtype=float)
df.set_value('a', 'D', 4.0)
df.set_value('b', 'E', 10.0)
D E F
a 4.0 NaN NaN
b NaN 10.0 NaN
c NaN NaN NaN
我可以通过以下调用轻松摆脱仅包含 NaN
的行:
df = df.dropna(how='all')
产生
D E F
a 4.0 NaN NaN
b NaN 10.0 NaN
如何在使用 dtype=str
初始化的数据帧上做同样的事情?以下不起作用:
df2 = pd.DataFrame(np.nan, index=list('abc'), columns=list('DEF'), dtype='str')
df2.set_value('a', 'D', 'foo')
df2.set_value('b', 'E', 'bar')
D E F
a foo n n
b n bar n
c n n n
然后是命令
df2 = df2.dropna(how='all')
返回未修改的数据框。
最佳答案
先调用df.replace
,再调用df.dropna
:
In [1576]: df2.replace('n', np.nan).dropna(how='all')
Out[1576]:
D E F
a foo NaN NaN
b NaN bar NaN
这似乎是最直接的选择。据我所知,一旦您使用 dtype=str
初始化您的数据框,您就丢失了 NaN
,因此这更像是一个最佳猜测替换(您可以使用合法的n
的非 NaN
条目被标记为误报并被删除)。
这是与 John Galt 类似的解决方案,但保留了 NaN
:
In [1584]: df2[~df2.eq('n')].dropna(how='all')
Out[1584]:
D E F
a foo NaN NaN
b NaN bar NaN
扩展 Andrew L 的评论,您不需要转换为 dtype=str
来设置值。您可以改用基于 .loc
的索引:
In [1586]: df2 = pd.DataFrame(np.nan, index=list('abc'), columns=list('DEF'))
...: df2.loc['a', 'D'] = 'foo'
...: df2.loc['b', 'E'] = 'bar'
...:
In [1587]: df2
Out[1587]:
D E F
a foo NaN NaN
b NaN bar NaN
c NaN NaN NaN
现在,
In [1588]: df2.dropna(how='all')
Out[1588]:
D E F
a foo NaN NaN
b NaN bar NaN
关于python - 如何在 dtype=str 的数据帧上使用 dropna?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817271/