【问题标题】:Collapse Pandas rows to elliminate NaN entries折叠 Pandas 行以消除 NaN 条目
【发布时间】: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

【问题讨论】:

    标签: python pandas dataframe numpy collapse


    【解决方案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
    

    【讨论】:

    • 效果很好!非常感谢。
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2013-09-22
    • 2021-07-21
    • 2019-08-07
    • 2021-12-22
    • 2018-04-24
    • 2019-03-11
    • 2014-10-13
    相关资源
    最近更新 更多