我的输入是一个字符串:

text = '''10 February 2023
abc
def
23 March 2023
ghi
jkl'''

我编写了以下代码(使用正则表达式,但我对任何其他 Select 都持开放态度):

data = []

for m in re.finditer(r'(\d+ \w+ \w+)\n(.*)', text, flags=re.I|re.S):
    data.append([m.group(1), m.group(2).splitlines()])
    
df = pd.DataFrame(data, columns=['date', 'letters']).explode('letters')

我的代码给出了这个奇怪的结果:

               date        letters
0  10 February 2023            abc
0  10 February 2023            def
0  10 February 2023  23 March 2023
0  10 February 2023            ghi
0  10 February 2023            jkl

当我期待着这个的时候:

               date        letters
0  10 February 2023            abc
0  10 February 2023            def
1     23 March 2023            ghi
1     23 March 2023            jkl

我如何修复我的代码?另外,你还有什么其他的建议吗?我很有兴趣向他们学习.

推荐答案

一个没有正则表达式的选项,利用pd.to_datetime的日期识别优势:

df = pd.DataFrame({'letters': text.splitlines()})
m = pd.to_datetime(df['letters'], errors='coerce').notna()

out = df.assign(date=df['letters'].where(m).ffill()
                ).loc[~m, ::-1].reset_index(drop=True)

替代语法:

s = pd.Series(text.splitlines())
m = pd.to_datetime(s, errors='coerce').notna()

df = pd.DataFrame({'date': s.where(m).ffill(), 'letters': s}
                  )[~m].reset_index(drop=True)

输出:

               date letters
0  10 February 2023     abc
1  10 February 2023     def
2     23 March 2023     ghi
3     23 March 2023     jkl

Python相关问答推荐

使用decorator 重复超载

Django文件上传不起作用:文件未出现在媒体目录或数据库中

Numpy索引argsorted使用integer数组,同时保留排序顺序

避免循环的最佳方法

已删除的构造函数调用另一个构造函数

使用Beautiful Soup获取第二个srcset属性

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

Django管理面板显示字段最大长度而不是字段名称

使用FASTCGI在IIS上运行Django频道

rame中不兼容的d类型

带条件计算最小值

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

从groupby执行计算后创建新的子框架

在Python中动态计算范围

Python+线程\TrocessPoolExecutor

需要帮助重新调整python fill_between与数据点

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

使用特定值作为引用替换数据框行上的值

try 检索blob名称列表时出现错误填充错误""

numpy.unique如何消除重复列?