Pandas 如果空白则合并行

Pandas merge rows if blank

我希望根据 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)

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

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

处理起来更容易
  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

哪个returns

      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')