【问题标题】:Pandas Grouping by Id and getting non-NaN values [duplicate]Pandas 按 Id 分组并获取非 NaN 值
【发布时间】:2021-12-31 02:32:14
【问题描述】:

我有一个表格,用于跟踪对销售人员记录的每个字段所做的更改。我的目标是按 saleforce_id 列分组,并将所有行合并为一个,如果有任何文本值,则用文本值替换空值。我尝试了 groupby 的不同变体,但似乎无法获得所需的输出。

【问题讨论】:

标签: python pandas dataframe pandas-groupby


【解决方案1】:

这应该做什么:

df.groupby('salesforce_id').first().reset_index(drop=True)

这会将所有列合并为一个,每次运行只保留非 NaN 值(除非该行的所有列中都没有非 NaN 值;那么最终合并列中的值将是 NaN )。

【讨论】:

    【解决方案2】:

    使用meltpivot

    out = df.melt('id').dropna() \
            .pivot('id', 'variable', 'value') \
            .rename_axis(index=None, columns=None)
    print(out)
    
    # Output:
        A   B   C
    1  A1  B1  C2
    

    设置:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'id': [1, 1, 1],
                       'A': ['A1', np.nan, np.nan],
                       'B': [np.nan, 'B1', np.nan],
                       'C': [np.nan, np.nan, 'C2'],
                       'D': [np.nan, np.nan, np.nan]})
    print(df)
    
    # Output:
       id    A    B    C   D
    0   1   A1  NaN  NaN NaN
    1   1  NaN   B1  NaN NaN
    2   1  NaN  NaN   C2 NaN
    

    【讨论】:

    • 我认为jezrael answer 更适合df.groupby('id', as_index=False).first(),如果这实际上是 OP 正在寻找的。​​span>
    • @HenryEcker。您如何看待问题中的如果有任何文本值。我知道如果没有文本值,OP 不需要该列。如果我是对的,在这种情况下@jezrael 的答案是不完整的(缺少.dropna(axis=1, how='all')
    • 我没有看到任何迹象表明他们想要删除完全为 NaN 的列。看起来他们希望每一列中都有一个文本值如果存在,否则将该列保持为 NaN。如果问题没有回答问题,OP 可以编辑问题并告诉我为什么答案不起作用并且可以重新打开。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多