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
处理起来更容易
- 索引是唯一的(因此在解决方案中重建索引)
- 我的空单元格是
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')
我希望根据 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
处理起来更容易- 索引是唯一的(因此在解决方案中重建索引)
- 我的空单元格是
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')