折叠 Pandas 行以消除 NaN 条目

Posted

技术标签:

【中文标题】折叠 Pandas 行以消除 NaN 条目【英文标题】:Collapse Pandas rows to elliminate NaN entries 【发布时间】:2021-08-13 03:50:40 【问题描述】:

让我们考虑以下DataFrame

Name A B C D
tom 10.0 NaN NaN NaN
tom NaN 15.0 NaN NaN
tom NaN NaN 20.0 NaN
tom NaN NaN NaN 25.0
tom 30.0 NaN NaN NaN
tom NaN NaN NaN 40.0
john 1.0 NaN NaN NaN
john NaN 2.0 NaN NaN
john NaN NaN 3.0 NaN
john NaN NaN NaN 4.0
john 5.0 NaN NaN NaN
john NaN 6.0 NaN NaN
john NaN NaN 7.0 NaN
john NaN NaN NaN 8.0

我想折叠它以限制 DataFrame 中 NaN 值的数量 - 可以是连续的,即尽可能组合相邻的行,但我关心的是列的值 A-D 对应于崩溃后同Name

我的完美结局是

Name A B C D
tom 10.0 15.0 20.0 25.0
tom 30.0 NaN NaN 40.0
john 1.0 2.0 3.0 4.0
john 5.0 6.0 7.0 8.0

据我了解,Pandas groupby('Name') 不会成功,因为它会为每个名称留下一个条目。

如果有任何帮助,我会使用字典来创建数据框。字典是这样的:


    "a": 
        "tom": [10.0, 30.0],
        "john": [1.0, 5.0]
    ,
    "b": 
        "tom": [15.0],
        "john": [2.0, 6.0]
    ,
    .....

所以,基本上,我会提取字典中的每个数字,然后用这个数字创建一行,然后合并所有行。

有没有一种简单的方法来折叠生成的 DataFrame 或在给定这样的字典的情况下构建更紧凑的 DataFrame

【问题讨论】:

【参考方案1】:

您可以.groupby + .transform(您可以在其中“向上移动”值)。然后删除包含所有 NaN 值的行:

print(
    df.set_index("Name")
    .groupby(level=0)
    .transform(lambda x: sorted(x, key=lambda k: pd.isna(k)))
    .dropna(axis=0, how="all")
    .reset_index()
)

打印:

   Name     A     B     C     D
0   tom  10.0  15.0  20.0  25.0
1   tom  30.0   NaN   NaN  40.0
2  john   1.0   2.0   3.0   4.0
3  john   5.0   6.0   7.0   8.0

【讨论】:

效果很好!非常感谢。

以上是关于折叠 Pandas 行以消除 NaN 条目的主要内容,如果未能解决你的问题,请参考以下文章

折叠堆栈面板时从网格中删除空间

Matlab FM解调和消除相位折叠效应

折叠 Pandas 数据框中的行,每列具有不同的逻辑 [重复]

layui侧边栏折叠和展开效果该怎么实现

将不同长度的逗号分隔数据行折叠成单列的首选 Pandas 解决方案 [重复]

10个交叉折叠的混淆矩阵 - 如何做到pandas dataframe df