Pandas dataframe使用条件将字符串拆分为多个列,但缺少d

2024-10-01 00:22:34 发布

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

所以我有一个数据帧,看起来像这样:

df = pd.DataFrame({'feature1':[34,45,52],'feature2':[1,0,1],'unparsed_features':["neoclassical, heavy, $2, old, bronze", "romanticism, gold, $5", "baroque, xs, $3, new"]})

df
       feature1  feature2                     unparsed_features
    0        34         1  neoclassical, heavy, $2, old, bronze
    1        45         0                 romanticism, gold, $5
    2        52         1                  baroque, xs, $3, new

我试图将列unparsed_features分成6列(权重、年龄、颜色、大小、价格和周期),但正如您所见,顺序混乱,不仅如此,一些字段也丢失了。在

我对每一列可能是什么有一个大致的想法,如下所示:

^{pr2}$

理想情况下,我希望我的数据帧如下所示:

df
   feature1  feature2                     unparsed_features weight price  age  \
0        34         1  neoclassical, heavy, $2, old, bronze  heavy    $2  old   
1        45         0                 romanticism, gold, $5           $5        
2        52         1                  baroque, xs, $3, new           $3  new   

  size  colour        period  
0       bronze  neoclassical  
1         gold   romanticism  
2   xs               baroque

我知道第一步是用逗号分隔字符串,但之后我就不知所措了。在

df['unparsed_features'].str.split(',')

谢谢你的帮助。在


Tags: 数据dfnewoldfeaturesxsgoldheavy
2条回答

坦白地说,W-B是正确的,你需要修改你的dict,但是用下面可用的数据来解决是我的方法

for keys in main_dict:
    data_list = []
    for value in df.unparsed_features: # for every row
        for l_data in main_dict[keys]:
            if keys == 'price':
                matching = [v for v in value.split(',') if l_data in v]
            else:
                matching = [v for v in value.split(',') if l_data == v.strip()]

            if matching:
                break

        if matching:
            data_list.append(matching[0])
        else:
            data_list.append(None)

        matching = ''  
    df[keys] = data_list

输出

^{pr2}$

由于'unparsed_features'中的数据不是每行都有相同的结构,因此不确定是否有一种简单的方法来完成它。一种方法可以是使用您定义的字典main_dict,循环每个项目,并使用^{}和参数pat稍微不同于price

for key, list_item in main_dict.items():
    if key =='price':
        df[key] = df.unparsed_features.str.extract('(\$\d+)').fillna('')
    else:
        df[key] = df.unparsed_features.str.extract('((^|\W)' +'|(^|\W)'.join(list_item) + ')').fillna('')

\$\d+允许查找符号$之后的任何数字,(^|\W)list_item中的任何单词之前查找空格或行首。在

你得到了预期的结果:

^{pr2}$

相关问题 更多 >