2015-11-02 42 views
1

我有一个数据帧,例如,4列[['a','b','c','d']],我添加另一列['total']包含所有其他列的总和为每一行。然后我添加另一列['growth of total']与总增长率。熊猫行下面每一行包含一个'na'

[['a','b','c','d']]中的部分值为空,表示['total']列对这些行无效。我可以很容易地用df.dropna(how ='any')摆脱这些行。

但是,我的增长率不仅对[['a','b','c','d']]中缺失值的行无效,而且对于下一行也是如此。我如何删除所有这些行?

+0

你不能只填写他们'df.fillna(0)'?然后总结他们? – EdChum

+0

我不确定你的意思。我已经照顾了空值的行。我的问题是,我也需要摆脱一行后面的空行值。 –

回答

1

IIUC正确,您可以使用notnullall屏蔽掉与NaN任何行和随后NaN行的任何行:

In [43]: 
df = pd.DataFrame({'a':[0,np.NaN, 2, 3,np.NaN], 'b':[np.NaN, 1,2,3,4], 'c':[0, np.NaN,2,3,4]}) 
df 

Out[43]: 
    a b c 
0 0 NaN 0 
1 NaN 1 NaN 
2 2 2 2 
3 3 3 3 
4 NaN 4 4 

In [44]: 
df[df.notnull().all(axis=1) & df.shift().notnull().all(axis=1)] 

Out[44]: 
    a b c 
3 3 3 3 
1

这里有一个选择,我认为没有你要找的内容:

In [76]: df = pd.DataFrame(np.arange(40).reshape(10,4)) 

In [77]: df.ix[1,2] = np.nan 

In [78]: df.ix[6,1] = np.nan 

In [79]: df['total'] = df.sum(axis=1, skipna=False) 

In [80]: df 
Out[80]: 
    0 1 2 3 total 
0 0 1 2 3  6 
1 4 5 NaN 7 NaN 
2 8 9 10 11  38 
3 12 13 14 15  54 
4 16 17 18 19  70 
5 20 21 22 23  86 
6 24 NaN 26 27 NaN 
7 28 29 30 31 118 
8 32 33 34 35 134 
9 36 37 38 39 150 

In [81]: df['growth'] = df['total'].iloc[1:] - df['total'].values[:-1] 

In [82]: df 
Out[82]: 
    0 1 2 3 total growth 
0 0 1 2 3  6  NaN 
1 4 5 NaN 7 NaN  NaN 
2 8 9 10 11  38  NaN 
3 12 13 14 15  54  16 
4 16 17 18 19  70  16 
5 20 21 22 23  86  16 
6 24 NaN 26 27 NaN  NaN 
7 28 29 30 31 118  NaN 
8 32 33 34 35 134  16 
9 36 37 38 39 150  16