我有一个表,用于跟踪salesforce记录中每个字段所做的更改。我的目标是按saleforce_id列进行分组,并将所有行合并为一行,如果存在任何文本值,则用文本值替换空值。我尝试过groupby的不同变体,但似乎无法获得所需的输出。
这应该做什么你什么:
df.groupby('salesforce_id').first().reset_index(drop=True)
这将把所有列合并为一个列,每次运行只保留非NaN值(除非该行的所有列中没有非NaN值;否则最终合并列中的值将为NaN)。
使用melt
和pivot
:
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