Python Pandas - 根据值删除行

标签 python python-2.7 pandas numpy dataframe

我有一个包含 A 列和 B 列的 Pandas 数据框

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'))

我创建了 C 列,如果 A > B

则它为 NULL
df['C'] = np.select([ df.A > df.B ], [df.A], default=np.NaN)

这给出了:

    A   B     C
0  95  19  95.0
1  46  11  46.0
2  96  86  96.0
3  22  61   NaN
4  69   1  69.0
5  78  91   NaN
6  42   7  42.0
7  24  28   NaN
8  55  92   NaN
9  92  16  92.0

然后我使用以下几种方法之一删除 df.C 为 NaN 的行:

df = df.dropna(subset=['C'], how='any')

df = df.drop(df[pd.isnull(df.C)].index)

df = df.drop(df[(pd.isnull(df.C))].index)

所有 3 种方法都给我大致的行数。在这种情况下:

    A   B     C
0  95  19  95.0
1  46  11  46.0
2  96  86  96.0
4  69   1  69.0
6  42   7  42.0
9  92  16  92.0

但是当我不使用数字时,例如字符串:

df['C'] = np.select([ df.A > df.B ], ['yes'], default=np.NaN)

然后那些相同的 3 种方法来删除 df.C 为 NaN 的行不会被过滤。例如,当 df.A > df.B 将 C 列设置为 yes 时,我得到如下信息:

    A   B    C
0   6  70  nan
1  85  46  yes
2  76  87  nan
3  77  36  yes
4  73  18  yes
5   1  41  nan
6  19  69  nan
7  62  89  nan
8   6   7  nan
9  35  75  nan

我可以解决这个问题,方法是将 pd.NaN 替换为“IGNORE”之类的字符串,然后过滤“IGNORE”,但我发现这个结果出乎意料。

df['C'] = np.select([ df.A > df.B ], ['yes'], default='IGNORE')
df = df.drop(df[(df.C == 'IGNORE')].index)

这是怎么回事? (当 df.C 是字符串时,我的 pd.NaN 是否被转换为字符串?)


我在 Windows 10 上使用 64 位 Python 2.7.13、Pandas 0.19.2 和 Numpy 1.11.3。

最佳答案

不是丢弃,而是只取有限值。

df = df[np.isfinite(df['C'])]

编辑:

根据您的评论,nanstring 类型,因此,根据值删除行:

df = df[df.C != "nan"] 会起作用

df[df.C.notnull()]
    A   B    C
0  67  23  yes
1  91  61  yes
2  30  92  nan
3  53  97  nan
4  81  11  yes
5  23   7  yes
6  47  39  yes
7  11  27  nan
8  46  55  nan
9  31  82  nan
df = df[df.C != "nan"]


    A   B    C
0  67  23  yes
1  91  61  yes
4  81  11  yes
5  23   7  yes
6  47  39  yes 

关于Python Pandas - 根据值删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42306473/

相关文章:

python - 在 Python 中创建可执行符号链接(symbolic link)?

python - 如何在 PyQt5 中按下时切换按钮文本

python - 将特定类别范围内的随机数分配给 Pandas 数据框

python - Pandas 'Freq' 标签中的有效值是什么?

python - Pandas - 计算场的平均值并乘以出现次数

python - 仅舍入 pandas.DataFrame 的数字元素而忽略字符串

Python - 忽略列表中的字符串不起作用

python - 如何使用 python pandas 计算总天数、小时数和分钟数?

python - 获取字典中第 x 大项

python - 使用子图调整图形周围的空间