【发布时间】:2023-01-25 13:30:41
【问题描述】:
我已经发布了一个类似的问题,jezrael perfertly 解决了这个问题。 但这次我有相同的数据框,其中有一个名为 label 的新行,如下所示:
| A1 | A2 | A3 | A4 | A5 | A6 | label |
|---|---|---|---|---|---|---|
| 1 | nan | 3 | 7 | nan | 8 | A |
| nan | 5 | nan | 11 | 9 | nan | A |
| 54 | 6 | 84 | 12 | 3 | nan | A |
| 10 | nan | nan | 16 | nan | 45 | B |
| 12 | 93 | 13 | 31 | 5 | 91 | B |
| 73 | nan | 45 | nan | nan | 9 | B |
我想根据标签列移动非 nan 值 n 行。
n = 1 的期望输出
| A1 | A2 | A3 | A4 | A5 | A6 | label |
|---|---|---|---|---|---|---|
| nan | nan | nan | nan | nan | nan | A |
| nan | nan | nan | 7 | nan | nan | A |
| 1 | 5 | 3 | 11 | 9 | nan | A |
| nan | nan | nan | nan | nan | nan | B |
| 10 | nan | nan | 16 | nan | 45 | B |
| 12 | nan | 13 | nan | nan | 91 | B |
上一篇没有标签栏的解决方案是
df = df.apply(lambda x: x.dropna().shift(1))
所以我试过了
columns = df.drop(columns = ['label']).columns
df[columns] = df.groupby(['label'])[columns].apply(lambda x: x.dropna().shift(1))
它只留下所有列中没有 nan 值的行 我只能尝试使用循环解决方案
for column in columns:
df[column] = df.groupby(['label'])[column].apply(lambda x: x.dropna().shift(1))
当列数变大时,速度又变慢了。想知道是否有办法使我尝试的解决方案有效。
【问题讨论】: