在python中拆分键值字符串并将其移动到df列中

2024-06-26 17:49:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我拥有的列,我想拆分成键值并存储在一个新的列中。你知道吗

{"FontStyle"=>"Gill Sans Standard", "FontSize"=>"Medium (3mm)"}
{"Font Style"=>"Gill Sans Standard","Font Size"=>"Medium (3mm)"}
{"Font Style":"Script","Font Size":"Medium (3mm)"}
{"Font Style"=>"Gill Sans Standard","Font Size"=>"Medium (3mm)"}
{"Font Style":"Gill Sans Standard","Font Size":"Medium (3mm)"}

主要的问题是其中一些有“=>;”,而另一些有冒号

我希望在df中有两个新的列,一个用于字体样式,另一个用于字体大小和其中所包含的值

如果有人能帮我做到这一点,那就太好了,如果你能推荐我一些关于regex的书/教程,那就太好了。你知道吗

谢谢


Tags: gtdfsizestyle字体scriptstandard键值
3条回答

我认为regex这里没有必要,使用:

import ast

print (df)
                                                 col
0  {"FontStyle"=>"Gill Sans Standard", "FontSize"...
1  {"Font Style"=>"Gill Sans Standard","Font Size...
2  {"Font Style":"Script","Font Size":"Medium (3m...
3  {"Font Style"=>"Gill Sans Standard","Font Size...
4  {"Font Style":"Gill Sans Standard","Font Size"...
5                                                NaN

d = {'=>':':', 'FontSize':'Font Size','FontStyle':'Font Style'}

regex = '|'.join(r"{}".format(x) for x in d.keys())
df1 = (df['col'].dropna()
                .str.replace(regex, lambda x: d[x.group()], regex=True)
                .apply(ast.literal_eval))
df2 = pd.DataFrame(df1.values.tolist())[['Font Size','Font Style']].dropna(how='all')
print (df2)
      Font Size          Font Style
0  Medium (3mm)  Gill Sans Standard
1  Medium (3mm)  Gill Sans Standard
2  Medium (3mm)              Script
3  Medium (3mm)  Gill Sans Standard
4  Medium (3mm)  Gill Sans Standard

解释:

  1. 首先通过^{}删除缺少的行
  2. 然后对字典中的值使用^{}
  3. 通过ast.literal_eval将值转换为字典
  4. 创建新数据帧
  5. 如果需要,只按列表过滤列,只移动NaN的行

到目前为止,这不是最有效的代码,但这可以完成这项工作。你知道吗

import pandas as pd
import ast

text = '''{"FontStyle"=>"Gill Sans Standard", "FontSize"=>"Medium (3mm)"}
{"Font Style"=>"Gill Sans Standard","Font Size"=>"Medium (3mm)"}
{"Font Style"=>"Script","Font Size"=>"Medium (3mm)"}
{"Font Style"=>"Gill Sans Standard","Font Size"=>"Medium (3mm)"}'''

my_list = []

text = text.replace("FontStyle", "Font Style")
text = text.replace("FontSize", "Font Size")
text = text.replace("=>", ":")
text = text.split("\n")

for one_dict in text:
    my_list.append(ast.literal_eval(one_dict))

df = pd.DataFrame(my_list)
print(df)

上述代码的输出:

      Font Size          Font Style
0  Medium (3mm)  Gill Sans Standard
1  Medium (3mm)  Gill Sans Standard
2  Medium (3mm)              Script
3  Medium (3mm)  Gill Sans Standard

我希望这有帮助。:-)如果有,请告诉我。你知道吗

试试这个:

import ast
df['col'] = df['col'].str.replace('=>', ': ').str.replace('FontSize', 'Font Size').str.replace('FontStyle', 'Font Style')
df['col']= df["col"].apply(lambda x : dict(ast.literal_eval(x)))
df1 = df['col'].apply(pd.Series)

相关问题 更多 >