python - 如何将子字符串拆分为数据帧的新行?

标签 python pandas data-wrangling

我有一个数据框,其中包含输入的数据,单词之间没有空格,即沃尔沃萨博沃克斯豪尔 = 沃尔沃萨博沃克斯豪尔。我想分隔每个单词并为每个单词插入新行,其中包含与其源自的行相同的数据 -

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/

相关文章:

Python 保存到映射共享驱动器时出错

python - numpy 数组项之间的最小二乘差

python - 使用 sklearn 在 3 维上进行 K 均值聚类

python - Pandas 数据帧上的追踪止损

r - R 中没有分隔符的 Pivot_longer()?

dataframe - Julia 。将一列汇总为具有多列的新 DataFrame

r - 创建一个包含列名称的新变量,以防值不为 NA

python - 从 Python 列表中删除重复的整数序列

python - 返回列中选择值的百分比计数

python - 使用 Pandas 聚合所有数据框行对组合