2016-09-22 127 views
-3

我的问题在下面的视频链接描述:如何基于另一个在熊猫中缺失值的列创建新列?

https://www.youtube.com/watch?v=nk5tBosK0iU

我不知道为什么我不能得到的条件(df[condition]),其中condition是一个变量,NaN值工作。

+0

只是另一侧的问题...我怎么能可以在新浏览器窗口中打开的Stackoverflow的链接? – clueple388

+1

有意思的是,您可以制作带有您问题的视频,但不是谷歌的答案,或者就此而言,请在此输入视频......我很抱歉,我无法对此做出视频回复。 – Kartik

+0

谢谢Kartik ...在我拍摄问题视频之前,我搜索了答案(尝试了np.where,lambda apply方法)...我也尝试从iPython Notebook输入(并粘贴)我的代码(和结果)。 。但仍然无法获得格式正确(想学习如何获得正确的表格格式在Stackoverflow虽然) – clueple388

回答

0

您需要通过pandas.isnull检查标NaN在自定义函数,但速度更快的解决方案是采用双numpy.where

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'CloseDelta':[np.nan,-0.5,0.5], 
        'B':[0,1,0]}) 

print (df) 
    B CloseDelta 
0 0   NaN 
1 1  -0.5 
2 0   0.5 

def f(x): 
    if (pd.isnull(x)): 
     return 0 
    elif (x<0): 
     return -1 
    else: 
     return 1 

df['new'] = np.where(df.CloseDelta.isnull(), 0, np.where(df.CloseDelta<0, -1, 1)) 

df['new1'] = df.CloseDelta.apply(f) 

print (df) 
    B CloseDelta new new1 
0 0   NaN 0  0 
1 1  -0.5 -1 -1 
2 0   0.5 1  1 

时序

#[300000 rows x 3 columns] 
df = pd.concat([df]*100000).reset_index(drop=True) 

In [28]: %timeit np.where(df.CloseDelta.isnull(), 0, np.where(df.CloseDelta<0, -1, 1)) 
100 loops, best of 3: 1.99 ms per loop 

In [29]: %timeit df.CloseDelta.apply(f) 
1 loop, best of 3: 245 ms per loop 
+0

谢谢jezrael ...让我试试... 让我们看看,如果我的新专栏,df。[' New'] = df。['CloseDelta']。apply(function)works ... :) – clueple388

+0

如果我的回答很有帮助,请不要忘记[accept](http://meta.stackexchange.com/a/5235/295067)。谢谢。 – jezrael

+0

非常感谢jezrael ... 只包括你在这个视频中所做的(用你的名字引用): https://www.youtube.com/watch?v=vQuerSKl1as – clueple388

相关问题