我有一个 pandas 数据框,它有重复的列符号行,看起来像这样:
df =
| Index | Symbol | Column A | Column B | Status |
|-------|----------|----------|----------|----------|
| 0 | x | a | np.nan | Default |
| 1 | y | d | c | Default |
| 2 | x | np.nan | e | Default |
我想将所有重复行合并到唯一行,用
Column A
和Column B
中的np.nan值替换为其他重复行的值,以及被合并的行的Status
值/更改为设置为合并。
我希望输出看起来像这样
| Index | Symbol | Column A | Column B | Status |
|-------|----------|----------|----------|----------|
| 0 | x | a | e | Merged |
| 1 | y | d | c | Default |
我试图将数据帧分成副本并再次合并它们
df1 = df.loc[df['Symbol'].duplicated()]
然后
df = pd.concat([df, df1], join = 'inner', axis = 1)
除此之外,我不知道如何进行。
您可以使用
group by
符号并使用bfill
来替换缺失值。然后把状态改成Merged
,保持组第一排
代码:
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Symbol': ['x', 'y', 'x'],
'Column A': ['a', 'd', np.nan],
'Column B': [np.nan, 'c', 'e'],
'Status': ['Default', 'Default', 'Default']
})
def merge_duplicates(group):
if group.isna().sum(axis=1).sum() > 0:
group.loc[group.index[0], 'Status'] = 'Merged'
group = group.fillna(method='bfill')
return group.iloc[0]
merged_df = df.groupby('Symbol').apply(merge_duplicates)
merged_df = merged_df.reset_index(drop=True)
merged_df
输出:
符号 | A列 | B列 | 状态 | |
---|---|---|---|---|
0 | x | a | e | 合并 |
1 | y | d | c | 默认 |