Python 合并特定行

Python 合并特定行,python,pandas,sorting,dataframe,merge,Python,Pandas,Sorting,Dataframe,Merge,我目前正在合并任何4个字母字符串之前的一行中的所有值。但是我希望应用这个特定的行,而不是所有的行。具体来说,我只想将其应用于Col A中X正下方的行。因此,如果是X则将函数应用于下面的行 d = ({ 'A' : ['X','Foo','No','X','Foo','X','F'], 'B' : ['','Bar','Merge','','Barr','','oo'], 'C' : ['','XXXX','XXXX','','','','B'],

我目前正在合并任何4个字母
字符串之前的一行中的所有值。但是我希望应用这个特定的行,而不是所有的行。具体来说,我只想将其应用于
Col A
X
正下方的行。因此,如果是
X
则将函数应用于下面的行

d = ({
    'A' : ['X','Foo','No','X','Foo','X','F'],           
    'B' : ['','Bar','Merge','','Barr','','oo'],
    'C' : ['','XXXX','XXXX','','','','B'],
    'D' : ['','','','','','','ar'],
    'E' : ['','','','','','','XXXX'],          
    })

df = pd.DataFrame(data=d)
此代码合并任何4个字母字符串之前的所有值:

mask = (df.iloc[:, 1:].applymap(len) == 4).cumsum(1) == 0
df.A = df.A + df.iloc[:, 1:][mask].fillna('').apply(lambda x: x.sum(), 1)
df.iloc[:, 1:] = df.iloc[:, 1:][~mask].fillna('')
输出:

         A     B     C D     E
0        X                    
1   FooBar        XXXX        
2  NoMerge        XXXX        
3        X                    
4      Foo  Barr              
5        X                    
6   FooBar                XXXX
正如您所看到的,这合并了整个
。我试图将其仅应用于
Col A
中value
X
下的行。我想我需要像这样的东西

if val in Col.A == 'X':
##Do this to the row directly beneath
mask = (df.iloc[:, 1:].applymap(len) == 4).cumsum(1) == 0
df.A = df.A + df.iloc[:, 1:][mask].fillna('').apply(lambda x: x.sum(), 1)
df.iloc[:, 1:] = df.iloc[:, 1:][~mask].fillna('')
预期产出:

        A      B     C D     E
0       X                     
1  FooBar         XXXX        
2      No  Merge  XXXX        
3       X                     
4     Foo   Barr              
5       X                     
6  FooBar                 XXXX

我们还需要为X条件下的行创建一个掩码。我为此准备了一系列的
maskX
,然后用它来更新您准备的
mask
。最终结果是期望的输出

d = ({
    'A' : ['X','Foo','No','X','Foo','X','F'],
    'B' : ['','Bar','Merge','','Barr','','oo'],
    'C' : ['','XXXX','XXXX','','','','B'],
    'D' : ['','','','','','','ar'],
    'E' : ['','','','','','','XXXX'],
    })


df = pd.DataFrame(data=d)
print(df)

#Create the mask (as series) to handle the row-under-X condition
maskX = df.iloc[:,0].apply(lambda x: x=='X')

#In the below line use some jugglery to mark the row next to X as True
maskX.index += 1

maskX = pd.concat([pd.Series([False]), maskX])
maskX = maskX.drop(len(maskX)-1)


mask = (df.iloc[:, 1:].applymap(len) == 4).cumsum(1) == 0
#combine the effect of two masks
for i,v in maskX.items():
    mask.iloc[i,:] = mask.iloc[i,:].apply(lambda x: x and v)

df.A[maskX] = df.A + df.iloc[:, 1:][mask].fillna('').apply(lambda x: x.sum(), 1)
df.iloc[:, 1:] = df.iloc[:, 1:][~mask].fillna('')
print(df)

谢谢@Pulkit Kansal。如果我的df有时间戳,我只是有点麻烦,但我将作为另一个问题发布。