【发布时间】:2018-04-08 13:16:40
【问题描述】:
假设有一个 pandas 数据框,如下所示: {a:[1,2,3,4], b:[1,2,3,?]} 假设字符串 'a' 和 'b' 中的值超过一千,我们还不知道有 '?'在系列b中。因此,当涉及到“b”时,我们一直使用“对象类型”
我们如何找出哪一行存在非浮点(非整数)值?
【问题讨论】:
假设有一个 pandas 数据框,如下所示: {a:[1,2,3,4], b:[1,2,3,?]} 假设字符串 'a' 和 'b' 中的值超过一千,我们还不知道有 '?'在系列b中。因此,当涉及到“b”时,我们一直使用“对象类型”
我们如何找出哪一行存在非浮点(非整数)值?
【问题讨论】:
假设您在同一列中有多行不是数字,
df = pd.DataFrame({'a':[1,2,3,4,5,6], 'b':['1','2','3','?', '?', 4]})
您可以使用以下方法获取所有这些非数字的索引,
pd.isnull(pd.to_numeric(df['b'], errors='coerce')).nonzero()[0]
你得到
array([3, 4])
如果您需要像此 df 中那样在多个列上执行此操作,
df = pd.DataFrame({'a':[1,'?',3,4,5,6], 'b':['1','2','3','?', '?', 4]})
试试
pd.isnull(df.apply(lambda x: pd.to_numeric(x, errors='coerce'))).any(1).nonzero()[0]
然后你得到
array([1, 3, 4])
【讨论】:
你可以使用这样的东西:
import pandas as pd
def make_float(v):
try:
return float(v)
except:
return pd.np.nan
df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [1, 2, 3, '?']})
df_float = df.applymap(make_float)
# or just df_float = df.apply(pd.to_numeric, errors='coerce')
在此之后,df_float 将是 float 类型,并且在出现无效条目的地方将具有 NaN 值。这会将有效的数字字符串(例如,'0.7')转换为浮点数;你必须决定这是否是一件好事。
然后,您可以通过此代码(来自 https://stackoverflow.com/a/33641639/3830997)找到 NaN 值(以前是 df 中的不可转换条目)的位置:
df_nan = df_float.unstack()
df_nan = df_nan[df_nan.isnull()]
df_nan
# b 3 NaN
【讨论】:
您可以轻松地使用 pandas 实现这一目标:
df.apply(pd.to_numeric,errors='coerce').isnull().any()
Out[795]:
a False
b True
dtype: bool
数据输入
df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [1, 2, 3, '?']})
【讨论】: