基于动态索引条件向 Pandas DataFrame 添加列

try*_*arn 4 python dataframe pandas

我有一个数据框,其中一列随机从 1 开始“计数”。我的目标是生成一个 new_col,将当前列除以计数中的最后一个值。请参阅下面的示例。

这是我当前的数据帧:

    col
0   1.0
1   2.0
2   3.0
3   1.0
4   2.0
5   1.0
6   2.0
7   3.0
8   4.0
9   5.0
10  1.0
11  2.0
12  3.0
Run Code Online (Sandbox Code Playgroud)

试图获得这样的输出:

    col  new_col
0   1.0  0.333
1   2.0  0.667
2   3.0  1.000
3   1.0  0.500
4   2.0  1.000
5   1.0  0.200
6   2.0  0.400
7   3.0  0.600
8   4.0  0.800
9   5.0  1.000
10  1.0  0.333
11  2.0  0.667
12  3.0  1.000
Run Code Online (Sandbox Code Playgroud)

这是我迄今为止尝试过的:

df['col_bool'] = pd.DataFrame(df['col']  == 1.0)
idx_lst = [x - 2 for x in df.index[df['col_bool']].tolist()]
idx_lst = idx_lst[1:]

mask = (df['col'] != 1.0)
df_valid = df[mask]
for i in idx_lst:
    df['new_col'] = 1.0 / df_valid.iloc[i]['col']
    df.loc[mask, 'new_col'] = df_valid['col'] / df_valid.iloc[i]['col']
Run Code Online (Sandbox Code Playgroud)

这可以理解地导致索引错误。也许我每次都需要制作一个 DataFrame 的副本并进行连接。我相信这会奏效,但我想问一下我在这里是否遗漏了任何捷径?

Sco*_*ton 7

尝试:

df['new_col'] = df['col'].div(df.groupby((df['col'] == 1).cumsum()).transform('last'))
Run Code Online (Sandbox Code Playgroud)

输出:

    col   new_col
0   1.0  0.333333
1   2.0  0.666667
2   3.0  1.000000
3   1.0  0.500000
4   2.0  1.000000
5   1.0  0.200000
6   2.0  0.400000
7   3.0  0.600000
8   4.0  0.800000
9   5.0  1.000000
10  1.0  0.333333
11  2.0  0.666667
12  3.0  1.000000
Run Code Online (Sandbox Code Playgroud)