循环遍历 Pandas 数据框中的行并更新对列条件的检查

问题描述

Row_Number A 列 B 列
1 数据 1 A
2 数据A
3 数据B
4 数据 2 B
5 数据C
6 数据D
7 数据E
8 数据 3 C

这是我的数据在另一个表的数据帧上更新的方式,在这个“数据 1”中,有一个延续为“数据 A”和“数据 B”,并且只有一个数据在列 B 上为“A”,但是在数据框中,所有“数据 1”、“数据 A”、“数据 B”都在单独的行中创建。 是否有任何操作可以将所有“Row_number” 1,2,3 连接到一行中,并且在 columnB 中只有“A”的值?

预期输出如下:

Row_Number A 列 B 列
1 数据1、数据A、数据B A
2 数据2、数据C、数据D、数据E B
3 数据3 C

提前致谢

我是 Python 新手,并尝试了以下代码

# variable that stores the values: table_values
import pandas as pd

df=pd.DataFrame(table_values,columns=['ColumnA','ColumnB'])

for index,row in df.iterrows():
  if df.loc[index,'ColumnB'] == '' & df.loc[index,'ColumnA'] != '':
    df.loc[index-1,'ColumnA'] = df.loc[index-1,'ColumnA'] + df.loc[index,'ColumnA']  
print(df)'''

解决方法

您可以在此处执行 groupby。最简单的方法是使用 Column B,因为它已经与您要分组的行相对应。因此,鉴于此数据:

import pandas as pd

df = pd.DataFrame({'ColumnA': ['Data1','DataA','DataB','Data2','DataC','DataD','DataE','Data3'],'ColumnB': ['A',None,'B','C']})

#  ColumnA ColumnB
# 0   Data1       A
# 1   DataA    None
# 2   DataB    None
# 3   Data2       B
# 4   DataC    None
# 5   DataD    None
# 6   DataE    None
# 7   Data3       C

通过填充缺失值来创建要分组的内容:

grouper = df['ColumnB'].ffill()

# 0    A
# 1    A
# 2    A
# 3    B
# 4    B
# 5    B
# 6    B
# 7    C
# Name: ColumnB,dtype: object

然后聚合成concat字符串,遵循this post

output = df['ColumnA'].groupby(grouper).apply(lambda x : ','.join(x)).reset_index()

最终结果:

  ColumnB                     ColumnA
0       A         Data1,DataA,DataB
1       B  Data2,DataC,DataD,DataE
2       C                       Data3