Python 合并特定行
我目前正在合并任何4个字母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'],
字符串之前的一行中的所有值。但是我希望应用这个特定的行,而不是所有的行。具体来说,我只想将其应用于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
中valueX
下的行。我想我需要像这样的东西
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有时间戳,我只是有点麻烦,但我将作为另一个问题发布。