将行我有一个熊猫数据帧的列A和BPython的大熊猫 - 基于价值
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'))
我创建列C,这是NULL,如果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然后过滤“忽略”,但我发现这个结果,否则意外。
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,熊猫0.19.2和1.11.3 NumPy的Windows 10.
@Psidom是的,没错。看起来NaN实际上是“不是数字”,并且正在转换为字符串“nan”。 – philshem
@Psidom如果你写你的评论作为答案我会很乐意接受它。它并没有真正解释为什么,但它肯定解决了这个问题 – philshem