从熊猫数据框中的多列构造瀑布算法

假设我有一个多列数据帧,并且希望实现一个瀑布样式算法,该算法采用第一列(如果存在),然后查看第二列(如果不存在),如果第二列不存在,则采用第三列的值列,依此类推,如果最后一列中缺少该列,则使用默认值(例如零)。我有一种方法,涉及累加一系列矢量操作(请参见下文),但似乎无法很好地扩展到更多列。当然,我可以通过行中的嵌套循环来做到这一点(非常不pythonic-对吗?)

frame = pd.DataFrame(np.arange(15).reshape((5,3)),index=['a','b','c','d','e'],columns=['X','Y', 'Z'])
#Make some missing values
frame['X'].ix[0:2] = None
frame['Y'].ix[1:4] = None
frame['Z'].ix[3:5] = None
#This is my kludgy waterfall for the three column case.
frame['Waterfall'] = frame['X'].fillna(0) + frame['Y'].fillna(0) * frame['X'].isnull() + frame['Z'].fillna(0) * (frame['X'].isnull() & frame['Y'].isnull())

我希望找到一个解决方案,该解决方案可以很好地扩展到任意长度的瀑布。如果可以使用Pythonic,那就太好了。理想情况下,它将是一个将列的有序列表标记为数据框作为参数并返回所需值的函数。

谢谢您的帮助。

汤姆·奥格斯·普格

首先,不要将其None用作丢失的数据值。这会强制将所有列都设为objectdtype,这会很慢。nan改用(这会使一切变得doubles如此,因此请小心使用浮点数。

我将使用该bfill方法fillna()

In [26]: frame.fillna(method='bfill', axis=1)['X'].fillna(0)
Out[26]: 
a     1
b     5
c     6
d     9
e    12
Name: X, dtype: float64

表现:

In [27]: %timeit frame['X'].fillna(0) + frame['Y'].fillna(0) * frame['X'].isnull() + frame['Z'].fillna(0) * (frame['X'].isnull() & fra
me['Y'].isnull())

1000 loops, best of 3: 776 µs per loop

In [28]: %timeit frame.fillna(method='bfill', axis=1)['X']
10000 loops, best of 3: 138 µs per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章