Pandas 数据框将长字符串列动态操作为 2 列

Posted

技术标签:

【中文标题】Pandas 数据框将长字符串列动态操作为 2 列【英文标题】:Pandas dataframe manipulating with long string column to 2 columns dynamically 【发布时间】:2021-09-13 11:56:14 【问题描述】:

我有数据框:

id greetingsname
1 hello+peter|goodbye+john
2 hi+cheff|gutentag+rudolf|goodafternoon+Alex

我想要

id greeting name
1 hello peter
1 goodbye john
2 hi cheff
2 gutentag rudolf
2 goodafternoon Alex

我不知道,如何动态拆分列 greetingsname,以获得我想要的,因为列 greetingsname 具有不同的字符串长度。但是分隔符分布保持不变greeting DELIMETER(+) name DELIMETER(|) greeting DELIMETER(+) name

从这个意义上说,它可以有不同的长度(几个名字和问候语,在另一列中有不同数量的名字和问候语)

谢谢

【问题讨论】:

【参考方案1】:

我们可以试试extractall

df.set_index('id')['greetingsname']\
  .str.extractall(r'(?P<greeting>[^+|]+)\+(?P<name>[^|]+)').droplevel(1)

         greeting    name
id                       
1           hello   peter
1         goodbye    john
2              hi   cheff
2        gutentag  rudolf
2   goodafternoon    Alex

【讨论】:

你能解释一下这个正则表达式是如何工作的吗? @tayfunyiğit 当然。我会用正则表达式的解释来编辑答案。【参考方案2】:

您可以为此使用爆炸:

df['greetingsname']=df['greetingsname'].apply(lambda x: x.split('|'))

res=df.explode('greetingsname')

print(res)

   id       greetingsname
0   1         hello+peter
0   1        goodbye+john
1   2            hi+cheff
1   2     gutentag+rudolf
1   2  goodafternoon+Alex

res[['greeting', 'name']] = res['greetingsname'].str.split('+', expand=True)

del res['greetingsname']

res.reset_index(drop=True, inplace=True)

print(res)

   id       greeting    name
0   1          hello   peter
1   1        goodbye    john
2   2             hi   cheff
3   2       gutentag  rudolf
4   2  goodafternoon    Alex

【讨论】:

以上是关于Pandas 数据框将长字符串列动态操作为 2 列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 检查列表列中的字符串列是不是按行排列

pandas使用describe函数输出指定数据列的描述性统计信息(无论数值列还是字符串列)设置include参数输出所有列的描述性统计信息

从 pandas DataFrame 中的多个字符串列中删除子字符串

仅对带有 Pandas 的字符串列应用转换,忽略数字数据

使用另一列作为索引的 Pandas 子字符串

从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]