我想创建以下数据框:
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
列但未达到目标。有什么建议吗?
答案 0 :(得分:5)
您可以使用:
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
答案 1 :(得分:3)
尝试:
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)
同样适用。由于我们正在前进,所以转变变得没必要了。
确认了ColonelBeauvel的建议:
df.C = np.where(df.A==-1, -df.B.replace(0, method='ffill').shift(), 0)
如果作为答案发布并且实际上是我的选择,也可以作为我选择的答案。
答案 2 :(得分:2)
在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