<p><code>str.findall</code>需要一个参数:regex模式。在</p>
<pre><code># Call `pop` here to remove the "events" column.
v = df.pop('eventlist').str.findall(r"t': '(.+?)'")
print(v)
0 [1234, 2345, 3456]
1 [2345, 1345, 1356, 1345, 1359]
2 [1334, 2345, 3556]
Name: events, dtype: object
</code></pre>
<p>然后可以将其加载到单独的列中:</p>
^{pr2}$
<hr/>
<p>另一个更好的选择是使用<code>re.compile</code>预编译模式并在循环中运行,从<code>findall</code>结果中提取第一个和最后一个项目。在</p>
<pre><code>import re
p = re.compile(r"t': '(.+?)'")
out = []
for name, string in zip(df.name, df.pop('eventlist')):
a = p.findall(string)
out.append([name, a[0], a[-1]])
pd.DataFrame(out, columns=['name', 't_first','t_last'], index=df.index)
name t_first t_last
0 a 1234 3456
1 b 2345 1359
2 c 1334 3556
</code></pre>
<p>如果需要将它们转换为int,请将<code>out.append([name, a[0], a[-1]])</code>替换为<code>out.append([name, int(a[0]), int(a[-1])])</code>。在</p>
<hr/>
<p>上面的解决方案假设您总是有多个匹配项。如果可能只有一个匹配项或没有匹配项,则可以通过检查<code>count</code>后面的匹配数来修改解决方案。在</p>
<pre><code>p = re.compile(r"t': '(.+?)'")
out = []
for name, string in zip(df.name, df.pop('eventlist')):
first = second = np.nan
if pd.notna(string):
a = p.findall(string)
if len(a) > 0:
first = int(a[0])
second = int(a[-1]) if len(a) > 1 else second
out.append([name, first, second])
pd.DataFrame(out, columns=['name', 't_first','t_last'], index=df.index)
name t_first t_last
0 a 1234 3456
1 b 2345 1359
2 c 1334 3556
</code></pre>