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的结果,我之前没有提到这一点,因为我不希望我的问题导致相当复杂的解决方案)