我有一个 Pandas 数据框,其中包含 A 和 B 两列。
我创建了 C 列,如果 A > B,则该列为空。
或者
或者
我可以通过将pd.NaN替换为类似于“IGNORE”的字符串,然后过滤“IGNORE”来解决这个问题,但我发现这个结果在其他方面是出乎意料的。
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)
这三种方法都给我大概相同的行数。在这种情况下:
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 是否被转换为字符串?)
我正在使用64位Python 2.7.13、Pandas 0.19.2和Numpy 1.11.3在Windows 10上。