提问者:小点点

熊猫按id分组并获得非NaN值[重复]


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


共2个答案

匿名用户

这应该做什么你什么:

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

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

匿名用户

使用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