我有一个包含 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
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'])]
编辑:
根据您的评论,nan
是 string
类型,因此,根据值删除行:
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/