我有一个与此类似的单列数据框:
cat = { 'cat': ['a','b','c-',' -d','e']}
df = pd.DataFrame(cat)
>>> print(df)
cat
0 a
1 b
2 c-
3 -d
4 e
我需要合并第 2 行和第 3 行:
cat
0 a
1 b
2 cd
3 e
我正在尝试使用正则表达式,因为这些多行数据始终采用“- {8}-”。但是这不起作用:
df['cat'] = df['cat'].str.replace("-\n {8}-","",flags=re.M)
我无法使用任何分组技术,所以我有点卡住了。谢谢您的任何建议。
您可以通过识别以 groupby
结尾或以
-
开头的字符串来使用 {8}-
方法:
m1 = df['cat'].str.endswith('-')
m2 = df['cat'].str.match(' {8}-')
group = (~(m1.shift(fill_value=False) & m2)).cumsum().rename()
out = (df['cat'].groupby(group)
.agg(lambda x: ''.join(x).replace('- -', ''))
.to_frame()
)
输出:
cat
1 a
2 b
3 cd
4 e
中间体:
cat m1 m2 group
0 a False False 1
1 b False False 2
2 c- True False 3
3 -d False True 3
4 e False False 4
我会这样做:
tmp = df["cat"].shift() + df["cat"]
m = tmp.str.contains(r"-\s{8,}-").eq(True)
df = df[~m.shift(-1).eq(True)]
df.update(tmp[m])
df["cat"] = df["cat"].str.replace(r"-\s{8,}-", "", regex=True)
print(df)
打印:
cat
0 a
1 b
3 cd
4 e