cumsum() 在多个列上
cumsum() over several columns
我想创建以下数据框:
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
我尝试通过 cumsum() 对 B
和 C
列进行操作,但效果并不理想。有什么建议吗?
尝试:
df.C = (df.B.replace(0, np.nan).ffill().shift() * (df.A == -1) * -1).fillna(0)
确认jezrael的建议:
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
编辑:
我找到了一种使用纯 pandas
:
的方法
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
我想创建以下数据框:
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
我尝试通过 cumsum() 对 B
和 C
列进行操作,但效果并不理想。有什么建议吗?
尝试:
df.C = (df.B.replace(0, np.nan).ffill().shift() * (df.A == -1) * -1).fillna(0)
确认jezrael的建议:
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
编辑:
我找到了一种使用纯 pandas
:
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