我想知道有没有更快的方法来解决这个问题而不使用for循环?
输入数据框如下所示:
0 1 2 3 4 5 6
0 x x 1 NaN NaN NaN NaN
1 x y 1 NaN NaN NaN NaN
2 y y 4 4 4 4 4
3 y z 5 2 7 4 0
4 x x NaN 5 7 4 9
5 x y NaN 9 4 5 10
我希望输出如下所示:
0 1 2 3 4 5 6
0 x x 1 5 7 4 9
1 x y 1 9 4 5 10
2 y y 4 4 4 4 4
3 y z 5 2 7 4 0
col0
和 col1
是一些信息。如果我们将它们作为一个信息,这两列将不会有 NaN,并且是唯一的。
这个数据框可能非常大,而且我不知道数据丢失在哪里。
最佳答案
如果每个组需要第一个非 NaN
值,请使用 GroupBy.first
:
df1 = df.groupby([0,1], as_index=False).first()
print (df1)
0 1 2 3 4 5 6
0 x x 1.0 5.0 7.0 4.0 9.0
1 x y 1.0 9.0 4.0 5.0 10.0
2 y y 4.0 4.0 4.0 4.0 4.0
3 y z 5.0 2.0 7.0 4.0 0.0
print (df)
0 1 2 3 4 5 6
0 x x 10.0 NaN NaN NaN NaN
1 x x 20.0 NaN NaN NaN NaN
2 x x 1.0 NaN NaN NaN NaN
3 x y 1.0 NaN NaN NaN NaN
4 y y 4.0 4.0 4.0 4.0 4.0
5 y z 5.0 2.0 7.0 4.0 0.0
6 x x NaN 5.0 7.0 4.0 9.0
7 x x NaN 50.0 70.0 4.0 9.0
8 x y NaN 9.0 4.0 5.0 10.0
如果每组有更多没有 NaN 的行,则可能会丢失一些数据:
df1 = df.groupby([0,1], as_index=False).first()
print (df1)
0 1 2 3 4 5 6
0 x x 10.0 5.0 7.0 4.0 9.0
1 x y 1.0 9.0 4.0 5.0 10.0
2 y y 4.0 4.0 4.0 4.0 4.0
3 y z 5.0 2.0 7.0 4.0 0.0
具有自定义功能的可能解决方案:
def f(x):
df1 = pd.DataFrame({y: pd.Series(x[y].dropna().values) for y in x})
return (df1)
df = df.set_index([0,1]).groupby([0,1]).apply(f).reset_index(level=2, drop=True).reset_index()
print (df)
0 1 2 3 4 5 6
0 x x 10.0 5.0 7.0 4.0 9.0
1 x x 20.0 50.0 70.0 4.0 9.0
2 x x 1.0 NaN NaN NaN NaN
3 x y 1.0 9.0 4.0 5.0 10.0
4 y y 4.0 4.0 4.0 4.0 4.0
5 y z 5.0 2.0 7.0 4.0 0.0
关于python - 用同一数据帧中的值填充 NaN 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56594621/