Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 几列上的cumsum()_Python_Pandas_Dataframe_Cumsum - Fatal编程技术网

Python 几列上的cumsum()

Python 几列上的cumsum(),python,pandas,dataframe,cumsum,Python,Pandas,Dataframe,Cumsum,我要创建以下数据帧: Index A B C a 0 0 0 b 1 10 0 c -1 0 -10 d 1 20 0 e 0 0 0 f -1 0 -20 g 0

我要创建以下数据帧:

Index       A        B        C
 a          0        0        0
 b          1       10        0
 c         -1        0      -10
 d          1       20        0
 e          0        0        0
 f         -1        0      -20
 g          0        0        0
 h          1       15        0
 i         -1        0      -15
给出了
A
B
<代码>C应通过函数生成,无需迭代。可能以这种方式:

def generate_C():
    C = np.where(A == -1, << here prior value from B * -1 >>, 0)
    df['C] = C
    return df
def generate_C():
C=np,其中(A==-1,>,0)
df['C]=C
返回df
我尝试通过cumsum()访问
B
C
列,但没有成功。有什么建议吗?

试试:

df.C = (df.B.replace(0, np.nan).ffill().shift() * (df.A == -1) * -1).fillna(0)

确认了耶斯雷尔的建议:

df.C = (df.B.replace(0, np.nan).ffill() * (df.A == -1) * -1).fillna(0)
df.C = np.where(df.A==-1, -df.B.replace(0, method='ffill').shift(), 0)
同样有效。因为我们是向前填充,所以这种转换变得不必要了

确认上校的建议:

df.C = (df.B.replace(0, np.nan).ffill() * (df.A == -1) * -1).fillna(0)
df.C = np.where(df.A==-1, -df.B.replace(0, method='ffill').shift(), 0)

同样有效,如果将其作为答案和我的选择发布,我的投票将成为我的选择。

numpy
中很容易做到,但我还没有找到一种方法直接在
pandas
中找到,因为显然
pandas
忽略了奇特的索引:

def generate_C(df, inplace=False):
    import numpy

    if not inplace:
        df = df.copy()

    A, B = df.values.T
    C = numpy.zeros_like(A)
    C[A==-1] = -B[A==1]
    df['C'] = C

    return df

编辑: 我找到了一种使用纯熊猫的方法:

def generate_C(df, inplace=False):
    if not inplace:
        df = df.copy()

    df['C'] = (-df.B[df.A==1]).reindex(df.A[df.A==-1].index,method='pad')
    df['C'].fillna(0, inplace=True)

    return df
您可以使用:

df.loc[df.A==-1, 'C'] = (-df.loc[df.A==1, 'B']).values
df.C.fillna(0, inplace=True)
print (df)
       A   B    C   
Index                 
a      0   0   0.0
b      1  10   0.0
c     -1   0 -10.0
d      1  20   0.0
e      0   0   0.0
f     -1   0 -20.0

你的问题很有趣。但是,我不理解与
cumsum
的关系。我认为您可以向数据帧添加更多值,因为不清楚为什么需要使用
cumsum
。我考虑使用cumsum(),因为B和C上的cumsum()应该导致B列中剩余的正值。例如,在C行:cumsum()B和C上方(从a行到B行)为+10。在Excel中,我会使用这样的=IF(A7=-1;SUM($B$2:C6)*-1;0)。我还是不明白。如果有可能在
B
?@jezrael列中增加更多的价值,则肯定欢迎另一种解决方案。这只是一个较大数据帧的一部分,其中所有组件都是通过函数生成的。因此,C的生成也应该是函数的一部分。编辑:添加了一些行,我认为可以省略
(df.B.replace(0,np.nan).ffill()*(df.A==-1)*-1)。fillna(0)
或者对于OP:
np.where(df.A==-1,-df.B.replace(0,method='ffill').shift(),0)
。与其使用NA,不如更简洁地说,'希望填充0值。“这听起来像是一个等待着发生的答案。我不知道您可以将
method='ffill'
传递到
replace
。太酷了!我认为这是一个简单的答案。“但是它和你的没什么不同,所以我不会把它发出去。”上校,这一行很有趣。我仍然需要测试列A和所有其他列(未全部显示)的生成在多大程度上受到shift和ffill的影响。在过去的版本中,我在函数和矢量化设计中使用shift()时也遇到了一些问题。这看起来尽可能接近我发布的内容,显然这是在
熊猫
中最具可读性的方法。我认为如果有人坚持使用纯熊猫,这应该是最好的方法。谢谢。我认为所有的解决方案都很好。也许你可以编辑答案,这样它就不会生成列
C2
,而不是
C
。乍一看,我对该方法需要一个“helper”列感到有点惊讶,但在阅读代码后,很明显情况并非如此。@jezrael,这个解决方案看起来接近我所寻找的。需要检查如何在函数中解释这一点,并查看A列的生成是否受到影响(因为它间接依赖于C的结果,我之前没有提到这一点,因为我不希望我的问题导致相当复杂的解决方案)