这是一个有些棘手的问题要解释。我正在尝试清理一个非常混乱的数据集,这似乎是最好的方式,即使它似乎并非如此。
我想在满足某些条件的单独列中组合字符串。具体来说,我想合并所有字符串,直到后续的4
字母字符串为止。我想将此功能应用于X
中df['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