首页 > 解决方案 > 以复杂的方式更改 DataFrame

问题描述

我有一个数据框如下:

id|s1|s2|s3|s4|s5
0|a|b|NaN|NaN|NaN
0|NaN|NaN|NaN|c|NaN
0|a1|NaN|NaN|c2|NaN
1|b|c|NaN|NaN|NaN
1|NaN|NaN|a1|NaN|NaN
1|a1|b|NaN|c1|NaN
.
.
.
.
1000(rows)...............

我希望这样重组:

id|s1|s2|s3|s4|s5
0|a|b|NaN|c|NaN
0|a1|b|NaN|c2|NaN
1|b|c|a1|c1|NaN
1|a1|b|a1|c1|NaN

我努力了:

df.unstack(),df.melt() and df.pivot()

他们都没有给我预期的结果。基本上我想尽可能地减少 NaN。任何人都可以建议我一个方法吗?我希望每个单元格只有一个条目,而不是单个单元格中的一组条目。我不想要 NaN 值,但我想要第一个输出中提到的流。仅当同一 id 中的任何行中都不存在值时,我才想要 NaN

标签: pythonpython-3.xpandasdataframe

解决方案


对每一行进行分组,id然后:ffill+bfilldrop_duplicates

df.groupby('id').apply(lambda x: x.ffill().bfill()).drop_duplicates()

   id  s1 s2   s3  s4  s5
0   0   a  b  NaN   c NaN
2   0  a1  b  NaN  c2 NaN
3   1   b  c   a1  c1 NaN
5   1  a1  b   a1  c1 NaN

推荐阅读