首页 > 解决方案 > 如果空白,熊猫会合并行

问题描述

只要合并不覆盖值,我就希望根据 id 组合行。

所以对于 df :

Column1 Column2 Column3 Column4
aa_1    123     456 
aa_2        123     
aa_4            123 
aa_6                
aa_1        789     789
aa_2    4567            
aa_4    234 456 678 987
aa_6    123 456 567 765

我正在寻找最终结果是:

,Column1,Column2,Column3,Column4
aa_1,123,789,456,789
aa_2,4567,123,,
aa_4,234,456,678,987
aa_4,,,123,
aa_6,123,456,567,765

重新创建数据框的代码:

data = [['123', '', '456', ''], ['', '123', '', ''], ['', '', '123', ''], ['', '', '', ''], ['', '789', '', '789'], ['4567', '', '', ''], ['234', '456', '678', '987'], ['123', '456', '567', '765']]
index = ['aa_1', 'aa_2', 'aa_4', 'aa_6', 'aa_1', 'aa_2', 'aa_4', 'aa_6']
columns = ['Column1', 'Column2', 'Column3', 'Column4']

df = pd.DataFrame(data, index, columns)

标签: pandasmergefillna

解决方案


它可能不是所有可能的解决方案中最优雅的,但这可以完成工作:

它首先预留已经填充的行的想法。在您的情况下,它是示例的最后两行。这样做的原因是它们总是会干扰以相同方式索引的任何其他行(aa_4 和 aa_6)。下一步是合并包含空单元格的行。但是,如果处理起来更容易

  1. 索引是唯一的(解决方案中的重新索引)
  2. 我空单元格是nan(其中的替换语句)

所以:

import pandas as pd
import numpy as np

data = [['123', '', '456', ''], ['', '123', '', ''], ['', '', '123', ''], ['', '', '', ''], ['', '789', '', '789'], ['4567', '', '', ''], ['234', '456', '678', '987'], ['123', '456', '567', '765']]
index = ['aa_1', 'aa_2', 'aa_4', 'aa_6', 'aa_1', 'aa_2', 'aa_4', 'aa_6']
columns = ['Column1', 'Column2', 'Column3', 'Column4']

df = pd.DataFrame(data, index, columns)
df = df.reset_index()

df2 = df.replace(r'^\s*$', np.nan, regex=True)
df3 = df2.dropna()
df4 = df[~df.index.isin(df3.index)]
df5 = df4.groupby(['index']).sum().reset_index()
df_full = pd.concat([df5,df3]).set_index(['index'])  #resets your original index

返回

      Column1 Column2 Column3 Column4
index                                
aa_1      123     789     456     789
aa_2     4567     123                
aa_4                      123        
aa_6                                 
aa_4      234     456     678     987
aa_6      123     456     567     765

您只需要删除空行,就像我在解决方案中所做的那样,例如,

df_full = df_full.replace(r'^\s*$', np.nan, regex=True)
df_full = df_full.dropna(how='all')

推荐阅读