繁体   English   中英

折叠 Pandas 行以消除 NaN 条目

[英]Collapse Pandas rows to elliminate NaN entries

让我们考虑以下 DataFrame

姓名 一个 C D
汤姆 10.0
汤姆 15.0
汤姆 20.0
汤姆 25.0
汤姆 30.0
汤姆 40.0
约翰 1.0
约翰 2.0
约翰 3.0
约翰 4.0
约翰 5.0
约翰 6.0
约翰 7.0
约翰 8.0

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

我的完美结果将是

姓名 一个 C D
汤姆 10.0 15.0 20.0 25.0
汤姆 30.0 40.0
约翰 1.0 2.0 3.0 4.0
约翰 5.0 6.0 7.0 8.0

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

如果这有任何帮助,我使用字典来创建 dataframe。 字典看起来像这样:

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

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

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

您可以.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM