Python 基于相邻行单元格值合并行

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”为空的行与前一

我的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 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