使用特定规则合并字符串

时间:2019-05-10 07:20:38

标签: python pandas masking

这是一个有些棘手的问题要解释。我正在尝试清理一个非常混乱的数据集,这似乎是最好的方式,即使它似乎并非如此。

我想在满足某些条件的单独列中组合字符串。具体来说,我想合并所有字符串,直到后续的4字母字符串为止。我想将此功能应用于Xdf['A']之后的所有值。

这可以使用下面的代码工作,但是我希望包含一个if/else语句,其中包含特定的4字母字符串,而不包含其他字符串。最好使用一个示例来显示它:

import pandas as pd

d = ({
    'A' : ['X','Include','X','Inclu','X','Incl','Y','X','Incl'],
    'B' : ['','Excl','','de','','ude','No','','ude'],           
    'C' : ['','X','','keep','','Excl','No','','keep'],
    'D' : ['','','','Excl','','ABC','Excl','','Excl'],
    })

df = pd.DataFrame(data=d)

g = (df['A'] == 'X').cumsum()
m = g.duplicated() & (df['A'] == '') | (df['A'] == 'X')
df = df[~m.groupby(g).transform('all')]

maskX = df.iloc[:,0].apply(lambda x: x=='X')
maskX.index += 1
maskX = pd.concat([pd.Series([False]), maskX])
maskX = maskX.drop(len(maskX)-1)
mask = (df.iloc[:, 1:].astype(str).applymap(len) == 4).cumsum(1) == 0

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('')

出局:

         A     B     C     D
0        X                  
1  Include  Excl     X      
2        X                  
3  Include        keep  Excl
4        X                  
5  Include        Excl   ABC
6        Y    No    No  Excl
7        X                  
8  Include        keep  Excl

这将合并所有columns直到一个4字母字符串。但是,我希望提供一个警告,其中组合了特定的4字母字符串。例如,我想将'keep'字符串组合到column A中,这意味着Excl是最后一个4字母字符串。

预期输出:

             A     B     C     D
0            X                  
1      Include  Excl     X      
2            X                  
3  Includekeep              Excl
4            X                  
5      Include        Excl   ABC
6            Y    No    No  Excl
7            X                  
8  Includekeep              Excl

0 个答案:

没有答案