我有一个数据框,其中包含输入的数据,单词之间没有空格,即沃尔沃萨博沃克斯豪尔 = 沃尔沃萨博沃克斯豪尔。我想分隔每个单词并为每个单词插入新行,其中包含与其源自的行相同的数据 -
type year colour
Mazda 1990 Cyan
VolvoSaabVauxhall 2000 Red
Lada 1980 Black
变成了
type year colour
Mazda 1990 Cyan
Volvo 2000 Red
Saab 2000 Red
Vauxhall 2000 Red
Lada 1980 Black
在不使用迭代的情况下实现这一目标的最佳方法是什么?
最佳答案
你说
it's always a Capital letter preceded by a lower case letter
所以它的正则表达式是
[A-Z][^A-Z]*
大写字母 ([A-Z]),后跟零个或多个 (*) 非大写字母(带有 ^)。
- 所以我们可以
找到所有
这样的匹配 - 将
类型
列指定为这些结果的列表 - 分解类型列
所以在代码中:
df.type = df.type.str.findall(r"[A-Z][^A-Z]*")
df = df.explode("type", ignore_index=True)
(如果你想很酷地将其写在一行中,请查找分配
)
示例运行:
In [436]: df
Out[436]:
type year colour
0 Mazda 1990 Cyan
1 VolvoSaabVauxhall 2000 Red
2 Lada 1980 Black
In [437]: df.type.str.findall(r"[A-Z][^A-Z]*")
Out[437]:
0 [Mazda]
1 [Volvo, Saab, Vauxhall]
2 [Lada]
Name: type, dtype: object
In [438]: df.type = df.type.str.findall(r"[A-Z][^A-Z]*")
In [439]: df
Out[439]:
type year colour
0 [Mazda] 1990 Cyan
1 [Volvo, Saab, Vauxhall] 2000 Red
2 [Lada] 1980 Black
In [440]: df.explode("type", ignore_index=True)
Out[440]:
type year colour
0 Mazda 1990 Cyan
1 Volvo 2000 Red
2 Saab 2000 Red
3 Vauxhall 2000 Red
4 Lada 1980 Black
我将 ignore_index=True
传递给 explode
;你可以取消通过并看看它做了什么!
关于python - 如何将子字符串拆分为数据帧的新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73363295/