gr1*_*e4r 4 python dataframe pandas
我在数据框中有四列,如下所示:
A B C D
75472 d1 x -36.0 0.0
75555 d2 x -38.0 0.0
75638 d3 x -18.0 0.0
75721 d4 x -18.0 1836.0
75804 d5 x 1151.0 0.0
75887 d6 x 734.0 0.0
75970 d7 x -723.0 0.0
Run Code Online (Sandbox Code Playgroud)
我想有条件地总结D:
所以对于上面, D 将是[-36, -74, -92, 1836, 2987, 3721, 2998]。
我已经能够用 for 循环成功地做到这一点
for i, row in me.iterrows():
try:
if row['D'] > 0:
step1 = me.loc[(me['B'] == row['B']) & (me['A'] == row['A']), 'output'].iloc[0]
me_copy.iloc[i, me_copy.columns.get_loc('output')] = step1
else:
step1 = me.loc[(me['B'] == row['B']) & (me['A'] == (row['A'] - pd.DateOffset(days=1))), 'step1'].iloc[0]
receipts_adjustments_sales = me.loc[(me['B'] == row['B']) & (me['A'] == row['A']), 'C'].iloc[0]
me_copy.iloc[i, me_copy.columns.get_loc('output')] = step1 + receipts_adjustments_sales
except:
me_copy.iloc[i, me_copy.columns.get_loc('output')] = 0
Run Code Online (Sandbox Code Playgroud)
但是 for 循环显然非常昂贵,反模式并且基本上不会覆盖我的整个数据帧。我试图在这里复制一个 excel 函数,该函数基本上是通过一组数据编写的,对于我的一生,我无法弄清楚如何使用:
pd.Series.shift()pd.Series.rolling()我尝试这样做shift()了一段时间,但我意识到我不得不为每一行创建一个单独的列,这就是我使用 for 循环的原因。
推广到组
df.loc[:, 'A_group'] = df.groupby(['A'])[df['D'] != 0].cumsum()
df.loc[:, 'E'] = df['D'].mask(df['D'] == 0).combine_first(df['C'])
df.loc[:, 'F'] = me.groupby(['A', 'A_group'])['E'].cumsum()
Run Code Online (Sandbox Code Playgroud)
感谢斯科特波士顿的帮助!
这是一种方法:
grp = (df['D'] != 0).cumsum()
df['D_new'] = df['D'].mask(df['D'] == 0).combine_first(df['C']).groupby(grp).cumsum()
df
Run Code Online (Sandbox Code Playgroud)
输出:
A B C D D_new
75472 d1 x -36.0 0.0 -36.0
75555 d2 x -38.0 0.0 -74.0
75638 d3 x -18.0 0.0 -92.0
75721 d4 x -18.0 1836.0 1836.0
75804 d5 x 1151.0 0.0 2987.0
75887 d6 x 734.0 0.0 3721.0
75970 d7 x -723.0 0.0 2998.0
Run Code Online (Sandbox Code Playgroud)
创建 grps 来帮助 cumsum。每个组都定义为“D”中出现的值,因此您之前停止 cumsum 并选择 D 的值并继续 cumsum 直到下一个值 'D'
grp = (df['D'] != 0).cumsum()
Run Code Online (Sandbox Code Playgroud)
输出:
A B C D D_new grp
75472 d1 x -36.0 0.0 -36.0 0
75555 d2 x -38.0 0.0 -74.0 0
75638 d3 x -18.0 0.0 -92.0 0
75721 d4 x -18.0 1836.0 1836.0 1
75804 d5 x 1151.0 0.0 2987.0 1
75887 d6 x 734.0 0.0 3721.0 1
75970 d7 x -723.0 0.0 2998.0 1
Run Code Online (Sandbox Code Playgroud)
现在,当 D 具有非零数时,让我们创建结合 'C' 和 'D' 的新列
df['newCD'] = df['D'].mask(df['D'] == 0).combine_first(df['C'])
Run Code Online (Sandbox Code Playgroud)
输出:
A B C D D_new grp newCD
75472 d1 x -36.0 0.0 -36.0 0 -36.0
75555 d2 x -38.0 0.0 -74.0 0 -38.0
75638 d3 x -18.0 0.0 -92.0 0 -18.0
75721 d4 x -18.0 1836.0 1836.0 1 1836.0
75804 d5 x 1151.0 0.0 2987.0 1 1151.0
75887 d6 x 734.0 0.0 3721.0 1 734.0
75970 d7 x -723.0 0.0 2998.0 1 -723.0
Run Code Online (Sandbox Code Playgroud)
最后,groupby 'grp' 和cumsumnewCD:
df['D_new_Details'] = df.groupby('grp')['newCD'].cumsum()
Run Code Online (Sandbox Code Playgroud)
输出:
A B C D D_new grp newCD D_new_Details
75472 d1 x -36.0 0.0 -36.0 0 -36.0 -36.0
75555 d2 x -38.0 0.0 -74.0 0 -38.0 -74.0
75638 d3 x -18.0 0.0 -92.0 0 -18.0 -92.0
75721 d4 x -18.0 1836.0 1836.0 1 1836.0 1836.0
75804 d5 x 1151.0 0.0 2987.0 1 1151.0 2987.0
75887 d6 x 734.0 0.0 3721.0 1 734.0 3721.0
75970 d7 x -723.0 0.0 2998.0 1 -723.0 2998.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |