如何将不同列中包含 np.nan 的数据框的重复行合并到只有非 nan 值的一行?

问题描述 投票:0回答:1

我有一个 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)

除此之外,我不知道如何进行。

pandas dataframe merge duplicates
1个回答
0
投票

您可以使用

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 默认
© www.soinside.com 2019 - 2024. All rights reserved.