【发布时间】:2017-03-15 09:25:02
【问题描述】:
以下代码创建一个随机数据帧,其值为 -1、0 或 1:
df = pd.DataFrame(np.random.randint(-1,2,size=(100, 1)), columns=['val'])
print(df['val'].value_counts())
让我们看看它包含什么:
-1 36
0 35
1 29
Name: val, dtype: int64
然后,我尝试创建一个名为 mysum 的新列,其累积条件总和遵循以下规则:
- 如果 val = 1 且 mysum >= 0,则 mysum = mysum + 1。
如果 val = 1 且 mysum
如果 val = -1 且 mysum
如果 val = -1 且 mysum > 0,则 mysum = mysum - 2
如果 val = 0 且 mysum
如果 val = 0 且 mysum > 0,则 mysum = mysum - 1。
如果 val = 0 且 mysum = 0,则 mysum = mysum。
所以恐怕没有这么简单:
df['mysum'] = df['val'].cumsum()
所以我尝试了以下方法:
df['mysum'] = 0
df['mysum'] = np.where((df['val'] == 1) & (df['mysum'].cumsum() >= 0), (df['mysum'].cumsum() + 1), df['mysum'].cumsum())
df['mysum'] = np.where((df['val'] == 1) & (df['mysum'].cumsum() < 0), (df['mysum'].cumsum() + 2), df['mysum'].cumsum())
df['mysum'] = np.where((df['val'] == -1) & (df['mysum'].cumsum() <= 0), (df['mysum'].cumsum() - 1), df['mysum'].cumsum())
df['mysum'] = np.where((df['val'] == -1) & (df['mysum'].cumsum() > 0), (df['mysum'].cumsum() - 2), df['mysum'].cumsum())
df['mysum'] = np.where((df['val'] == 0) & (df['mysum'].cumsum() > 0), (df['mysum'].cumsum() - 1), df['mysum'].cumsum())
df['mysum'] = np.where((df['val'] == 0) & (df['mysum'].cumsum() < 0), (df['mysum'].cumsum() + 1), df['mysum'].cumsum())
print(df['mysum'].value_counts())
print(df)
但是mysum的列没有累积!
这是一个你可以尝试的小提琴:https://repl.it/FaXZ/8
【问题讨论】:
-
当 mysum 和 current val 都为 0 时 mysum 会发生什么?
-
我没有意识到!我也添加了这个推理!谢谢
-
(如果这样发布循环解决方案是不可取的......)
-
@ntg 如何以非循环方式进行?
-
好的,我的意思是明显的循环。检查 cumsum 的代码,我看到它是从以下位置添加到 generic.py 中的: cls.cumsum = _make_cum_function(cls, 'cumsum', name, name2, axis_descr, "cumulative sum",lambda y, axis: y.cumsum( axis), 0., np.nan), 类似cummmin等。可能会有一些 tweeks 以 pandas.Datafame 结束,通过在那里提供正确的函数来丰富 specialcumsum...