gpt4 book ai didi

python - 从 Pandas 数据框中的多列构建瀑布算法

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:44 25 4
gpt4 key购买 nike

假设我有一个多列数据框,我希望实现一个瀑布式算法,如果第一列存在,则获取第一列,如果不存在,则查看第二列,如果不存在,则获取值在第三列中,依此类推,如果最后一列中缺少,则采用默认值(比如零)。我有一种方法可以做到这一点,包括将一系列矢量运算相加(见下文),但它似乎不能很好地扩展到更多列。而且,当然,我可以通过行的嵌套循环来做到这一点(非常不符合 Python 规范——对吧?)。

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 作为您的缺失数据值。这会强制您的所有列都为 object dtype,这会很慢。请改用 nan(这会使所有内容都加倍,因此请小心处理 float 。

我会为 fillna() 使用 bfill 方法:

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

关于python - 从 Pandas 数据框中的多列构建瀑布算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22863830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com