我的数据框位于 df1 下方:
我想通过以下方式根据 ID 列对行进行分组:
我怎样才能以最优化的方式做到这一点?
我尝试使用 groupby 功能,但没能得到我想要的,我很确定有一个最佳方法可以做到这一点,但现在无法弄清楚。
假设空单元格为 NaN/None,您可以计算 Value 中前导空行的数量、Label 中尾随空行的数量,然后
groupby.apply
到 shift
向上赋值并使用 删除最后的空行head
:
def cust_shift(g):
# number of leading empty rows
n1 = g['Value'].isna().cummin().sum()
# number of trailing empty rows
n2 = g.loc[::-1, 'Label'].isna().cummin().sum()
# shift Value up and remove trailing empty rows
return g.assign(Value=g['Value'].shift(-n1)).head(-min(n1, n2))
out = df.groupby('ID', group_keys=False)[list(df)].apply(cust_shift)
输出:
ID Label Value
0 id_1 A 10.0
1 id_1 B 20.0
2 id_1 C 30.0
3 id_1 D NaN
4 id_1 E NaN
8 id_2 F 40.0
9 id_2 G 50.0
10 id_2 H 60.0
11 id_2 None 70.0