使用熊猫从数据框的两列中过滤非数字数据

ZSG

我正在加载具有许多数据类型(从Excel加载)的Pandas数据框。两个特定的列应该是浮点数,但研究人员有时会输入诸如“未测量”之类的随机注释。我需要删除两列之一中的任何值都不是数字的任何行,并在其他列中保留非数字数据。一个简单的用例看起来像这样(实际表有几千行...)

import pandas as pd

df = pd.DataFrame(dict(A = pd.Series([1,2,3,4,5]), B = pd.Series([96,33,45,'',8]), C = pd.Series([12,'Not measured',15,66,42]), D = pd.Series(['apples', 'oranges', 'peaches', 'plums', 'pears'])))

结果在此数据表中:

    A   B   C               D
0   1   96  12              apples
1   2   33  Not measured    oranges
2   3   45  15              peaches
3   4       66              plums
4   5   8   42              pears

我不清楚如何到达此表:

    A   B   C               D
0   1   96  12              apples
2   3   45  15              peaches
4   5   8   42              pears

我尝试了dropna,但是类型是“对象”,因为存在非数字条目。我不能将值转换为浮点数,而不能转换整个表,或者一次执行一系列操作而失去与该行中其他数据的关系。也许有一些我不了解的简单事情?

耶斯列尔

您可以首先创建带有列的子集BC然后检查值是否为然后使用布尔索引apply to_numericallnotnull

print df[['B','C']].apply(pd.to_numeric, errors='coerce').notnull().all(axis=1)
0     True
1    False
2     True
3    False
4     True
dtype: bool

print df[df[['B','C']].apply(pd.to_numeric, errors='coerce').notnull().all(axis=1)]
   A   B   C        D
0  1  96  12   apples
2  3  45  15  peaches
4  5   8  42    pears

下一个str.isdigitisnulland xor(^)结合使用的解决方案

print df['B'].str.isdigit().isnull() ^ df['C'].str.isdigit().notnull()
0     True
1    False
2     True
3    False
4     True
dtype: bool

print df[df['B'].str.isdigit().isnull() ^ df['C'].str.isdigit().notnull()]
   A   B   C        D
0  1  96  12   apples
2  3  45  15  peaches
4  5   8  42    pears

但是to_numeric使用isnull和的解决方案notnull最快:

print df[pd.to_numeric(df['B'], errors='coerce').notnull() 
       ^ pd.to_numeric(df['C'], errors='coerce').isnull()]

   A   B   C        D
0  1  96  12   apples
2  3  45  15  peaches
4  5   8  42    pears

时间

#len(df) = 5k
df = pd.concat([df]*1000).reset_index(drop=True)

In [611]: %timeit df[pd.to_numeric(df['B'], errors='coerce').notnull() ^ pd.to_numeric(df['C'], errors='coerce').isnull()]
1000 loops, best of 3: 1.88 ms per loop

In [612]: %timeit df[df['B'].str.isdigit().isnull() ^ df['C'].str.isdigit().notnull()]
100 loops, best of 3: 16.1 ms per loop

In [613]: %timeit df[df[['B','C']].apply(pd.to_numeric, errors='coerce').notnull().all(axis=1)]
The slowest run took 4.28 times longer than the fastest. This could mean that an intermediate result is being cached 
100 loops, best of 3: 3.49 ms per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我想过滤出一个非数字值,并使用数据框(熊猫)中的其他两列来计算它的新值

来自分类Dev

如何过滤熊猫数据框中的数字?

来自分类Dev

在列SQL中过滤仅包含数字数据的行

来自分类Dev

比较熊猫数据框中的两列

来自分类Dev

连接熊猫数据框中的两列

来自分类Dev

连接熊猫数据框中的两列

来自分类Dev

按数据框中的两列过滤

来自分类Dev

使用OR根据两列过滤数据框

来自分类Dev

通过汇总两列来过滤熊猫数据框

来自分类Dev

过滤熊猫数据框中的两列,其中一列代表通话时间

来自分类Dev

过滤熊猫数据框中的两列,其中一列代表通话时间

来自分类Dev

在熊猫中的数据框中查找非数字行?

来自分类Dev

过滤熊猫中的数据框

来自分类Dev

过滤熊猫中的数据框

来自分类Dev

熊猫中的数据框过滤

来自分类Dev

如果包含任何字母表(非数字),如何从熊猫数据框中删除多列?

来自分类Dev

熊猫检测非数字数据类型

来自分类Dev

熊猫:删除多列,仅保留数字数据列

来自分类Dev

根据多列中的值过滤熊猫数据框

来自分类Dev

根据列中的最大值过滤数据框-熊猫

来自分类Dev

将逗号分隔的数据框中的列转换为要绘制的数字数据

来自分类Dev

在R数据帧或向量中查找非数字数据

来自分类Dev

如何减去熊猫数据框的 1 列中的数字?

来自分类Dev

删除列中以熊猫数据框中非数字开头的记录

来自分类Dev

使用字典中的值过滤熊猫数据框

来自分类Dev

使用列表中定义的多个条件过滤熊猫数据框

来自分类Dev

过滤熊猫中的数据框:使用条件列表

来自分类Dev

熊猫数据框过滤

来自分类Dev

根据日期列熊猫过滤数据框

Related 相关文章

热门标签

归档