繁体   English   中英

如何确定一个numpy数组或熊猫行是否包含字符串?

[英]how to determine if a numpy array or pandas row contains a string?

我有一个浮点数的df df,但是由于我从中接收数据的程序的输出不正确/错误,许多行包含实际上是字符串的值。

我想用最少的循环从df中删除这些行。 理想情况下,我想将df中的所有值都屏蔽为字符串值,并使用True值删除行。 另一方法是遍历每一行并屏蔽每一行,如果掩码中为True,则将其删除。 最糟糕的情况是遍历每一行,也遍历每个值以实现相同的任务。

谁能建议我如何最有效地做到这一点?

类似于df.iloc [x] .istype(str)之类的东西?

我尝试了df.loc [row_num]。 包含 (str)是徒劳的尝试,但没有用。

我知道我可以遍历每个单元格并执行isinstance(cell,str)来检查它是否是字符串,但实际上更喜欢某种掩蔽技术。

作为缩小所有解决方案范围的补充说明,我不想将任何字符串值都固定为浮点数,我只想删除整行。

提前致谢。

有问题的行的示例如下,请注意该字符串带有两个小数:

df.loc[516].values

array([890.0, 33.17, 29.64, 78.355, 80.182, 83.196, 86.721,
       90.12299999999999, 92.807, '91.705.099', 98.89, 99.007,
       99.34200000000001, 99.337, 100.43799999999999, 99.867, '100.625',
       100.712, 100.46, 100.427, 101.16799999999999, 100.904, 100.193,
       100.255, 100.537, 100.37100000000001, 100.535, 100.584, 101.52,
       101.787, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan], dtype=object)

您可以转置数据帧,然后尝试使用pd.to_numeric()转换每一列(最初是行)。 如果由于无法转换为int或float的字符串而导致解析错误,则会抛出ValueError。 您可以捕获此异常并删除该列。 像这样:

df_transposed = df.T

for col in df_transposed:
    try:
        df_transposed[col] = pd.to_numeric(df_transposed[col])
    except ValueError:
        df_transposed = df_transposed.drop(columns=[col], axis=1)

df = df_transposed.T

尝试map并检查类型str

df.loc[516].map(type).eq(str).any()

如果行516任何单元格是str类型,它将返回True

如果要检查整个df ,只需使用applymap

df.applymap(type).eq(str).any(1)

它将为每行返回一个序列掩码True/False

使用isrealall我们可以选择所有元素都是真实的所有行,即int或float:

df[df.applymap(np.isreal).all(axis=1)]

例:

df = pd.DataFrame({'a': [1,'2',3], 'b': [10,20,np.nan]})
df = df[df.applymap(np.isreal).all(axis=1)]

   a     b
0  1  10.0
2  3   NaN

(注意:这当然也会过滤出复数,尽管它们是数字)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM