pandas 如何将不同列中包含np.nan的 Dataframe 的重复行合并为一行,其中只有not nan值?

6yt4nkrj  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(140)

我有一个Pandas Dataframe ,其中有重复行的列符号,看起来像这样:

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 AColumn B中的np.nan值替换为其他重复行中的值,并将合并/更改的行的Status值设置为Merged。

| Index |  Symbol  | Column A | Column B |  Status  |
|-------|----------|----------|----------|----------|
|   0   |    x     |     a    |     e    |  Merged  |
|   1   |    y     |     d    |     c    |  Default |

我已尝试将 Dataframe 分成两份,然后再次合并
df1 = df.loc[df['Symbol'].duplicated()]然后df = pd.concat([df, df1], join = 'inner', axis = 1)
除此之外,我不知道该如何进行。
接受的答案不适用于

|index|Ticker|Entry Date|Exit Date|Transaction Type|Entry Price|Exit Price|
|---         |---       |---|---|---|---|---|
|0|DEEPAKNTR |2020-01-03|NaN|Buy|386\.45|NaN|
|1|SRF       |2020-01-03|NaN|Buy|690\.53|NaN|
|2|RELAXO    |2020-01-03|NaN|Buy|629\.4|NaN|
|3|BERGEPAINT|2020-01-03|NaN|Buy|509\.8|NaN|
|4|ADANITRANS|2020-01-03|NaN|Buy|346\.55|NaN|
|5|ALKYLAMINE|2020-01-03|NaN|Buy|465\.24|NaN|
|6|ABBOTINDIA|2020-01-03|NaN|Buy|13248\.25|NaN|
|7|PHOENIXLTD|2020-01-03|NaN|Buy|857\.0|NaN|
|8|BAJFINANCE|2020-01-03|NaN|Buy|4193\.4502|NaN|
|9|MUTHOOTFIN|2020-01-03|NaN|Buy|770\.8|NaN|
|10|COFORGE  |2020-01-03|NaN|Buy|1630\.95|NaN|
|11|AAVAS    |2020-01-03|NaN|Buy|2039\.9|NaN|
|12|KOTAKBANK|2020-01-03|NaN|Buy|1657\.1|NaN|
|13|ADANIGREEN|2020-01-03|NaN|Buy|192\.6|NaN|
|14|RATNAMANI|2020-01-03|NaN|Buy|736\.0334|NaN|
|15|BAJAJFINSV|2020-01-03|NaN|Buy|934\.585|NaN|
|16|HCLTECH   |2020-01-03|NaN|Buy|585\.05|NaN|
|17|GMMPFAUDLR|2020-01-03|NaN|Buy|621\.9833|NaN|
|18|JUBLFOOD  |2020-01-03|NaN|Buy|336\.55|NaN|
|19|HDFC      |2020-01-03|NaN|Buy|2454\.45|NaN|```

输出显示为Gaps in blk ref_locs

rjee0c15

rjee0c151#

您可以使用group by符号并使用bfill替换缺失的值。检查组中是否包含NaN并将状态更改为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栏|现况|
| - ------|- ------|- ------|- ------|- ------|
| 无|x|项目a|电子|合并|
| 1个|Y型|日|(c)秘书长的报告|默认值|

相关问题