Python 基于相邻行单元格值合并行
我的df有时(并非总是)有空单元格的行,除了一行:Python 基于相邻行单元格值合并行,python,pandas,Python,Pandas,我的df有时(并非总是)有空单元格的行,除了一行: | A | B| C| 0| white| one| 1| 1| | | 2| 2| blue | two| 3| 3| | | 4| 4| | | 5| 5| black| three| 6| 6| brown| four| 7| 我想要完成的是将列“A”和“B”为空的行与前一
| A | B| C|
0| white| one| 1|
1| | | 2|
2| blue | two| 3|
3| | | 4|
4| | | 5|
5| black| three| 6|
6| brown| four| 7|
我想要完成的是将列“A”和“B”为空的行与前一行合并。输出应如下所示:
| A | B| C|
0| white| one| 1 2|
2| blue | two| 3 4 5|
5| black| three| 6|
6| brown| four| 7|
可能的组合有:
- 没有包含空单元格的相邻行(第5、6行)
- 一个相邻的空单元格行(第0、1行)
- 多个相邻行,其中有空单元格(第2-4行)
df.groupby(np.arange(len(df))//2).sum()
| A| B| C
0| white| one| 1 2
2| white| one|3 4 5
5| white| one| 6
6| white| one| 7
但我无法找出其他/组合的情况
谢谢你的帮助
更新:
正如在尝试提供的解决方案后得出的结论,df也有类似的情况:
| A| B| C
0| white| one| 1
1| | | 2
2| white| one| 3
3| | | 4
4| | | 5
5| white| one| 6
6| white| one| 7
根据提供的这些数据,解决方案得出以下结果:
| A| B| C
0| | | 2 4 5
1| white| one| 1 3 6 7
虽然预期应该是这样的:
df.groupby(np.arange(len(df))//2).sum()
| A| B| C
0| white| one| 1 2
2| white| one|3 4 5
5| white| one| 6
6| white| one| 7
使用类似于:
df.groupby(df.A.ffill()).agg({'B':'first','C':lambda x: ','.join(map(str,x))}).reset_index()
甚至更好(感谢@piRSquared):
如果要将订单保留为原始df,请尝试:
m=df.groupby(df.A.ffill()).agg({'B':'first','C':lambda x: ','.join(map(str,x))}).\
reindex(df.A.dropna().unique())
m=m.reset_index()
print(m)
注意执行此操作之前,请将空格替换为
np.nan
编辑:
根据您的更新,您可以执行以下操作:
df=df.replace(r'^\s*$', np.nan, regex=True) #to replace whitespaces to NaN(optional)
new_df=(df.astype({'C': str}).groupby(df['A'].notnull().cumsum())
.agg({'A':'first','B':'first','C':' '.join}).reset_index(drop=True))
print(new_df)
ffill
真是个好主意df.astype({'C':str}).ffill().groupby(['A','B']).C.apply(''.join).reset_index()
@piRSquared谢谢先生。)将在一点时间内更新这个优雅的。我有相当广泛的df,但无论如何都有问题,因为这些解决方案不太有效。可能是我的数据集中缺少了什么(我已经发现那些“空”行之间有重复项。当然,这里没有抱怨。我看到我在数据集上得到了部分结果。它似乎在向“空”行添加信息(我想反之亦然),并删除重复项(我假设GroupBy)@anky_91,正如您所说,它正在处理发布的数据帧。问题是,我没有预料到我的数据集中会出现类似于blow的情况:一个B C 0白色1 1 1 2白色1 3 4 4 5 5白色1 6白色1 7,它给出了我这样的输出:A B C 0 2 4 5 1白色1 3 6 7抱歉,我不确定如何在注释中编辑表格。
A B C
0 white one 1 2
1 white one 3 4 5
2 white one 6
3 white one 7