【问题标题】:How to extract the following using pandas or regex [closed]如何使用熊猫或正则表达式提取以下内容[关闭]
【发布时间】:2018-11-24 03:21:47
【问题描述】:

以下是 pandas 数据框中的一列。我想获取所有独特的值,例如样式、颜色、风味、大小、气味名称...

Style: Lovenest - Newborn Pillow|||Color: Gray #Style and Color from this row
Style: Baby Calendula Face Cream #Style from this row
Color: Brown #Color from this row
Color: Matrix|||Item Package Quantity: 1 #Color & Item Package Quantity from this row
Color: Matrix|||Item Package Quantity: 1 #Color & Item Package Quantity from this row
Flavor: Baby Colic Babies Magic Tea|||Size: 1 Pack #Flavor & Size from this row
Scent Name: Sensitive|||Size: 100 Count (Pack of 6) #Scent Name & Size from this row
Scent Name: Sensitive|||Size: 100 Count (Pack of 6) #Scent Name & Size from this row

In [3]: df['variations'].head()
Out[3]: 
0    Style: Lovenest - Newborn Pillow|||Color: Gray
1    Style: Lovenest - Newborn Pillow|||Color: Gray
2    Style: Lovenest - Newborn Pillow|||Color: Gray
3    Style: Lovenest - Newborn Pillow|||Color: Gray
4    Flavor: Baby Colic Babies Magic Tea|||Size: 1 Pack
Name: variations, dtype: object

预期输出['Style','Color','Flavor','Size']

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    您可以使用字符串方法按某种模式拆分值。

    稍后将每个字符串拆分成键值对并取出键部分。

    In[1]: df['variations'].str.split('\|\|\|').apply(lambda items: [item.split(':')[0] for item in items])
    Out[1]: 
    0                     [Style, Color]
    1                     [Style, Color]
    2                     [Style, Color]
    3                     [Style, Color]
    4                     [Style, Color]
    Name: item, dtype: object
    

    编辑:我看到您更改了输入和预期输出。如果您尝试获取列中的所有键集,那么您可以在 pandas 中完成所有操作,而无需逐行迭代它。

    In[1]: keys_list = df['variations'].apply(lambda x: [y.split(': ')[0] for y in x.split('|||')]).tolist()
    In[2]: list(set([key for keys in keys_list for key in keys]))
    Out[2]: ['Flavor', 'Item Package Quantity', 'Size', 'Color', 'Style', 'Scent Name']
    

    【讨论】:

      【解决方案2】:
      In [25]: data = []
      ...: for x in df['variations']:
      ...:     if pd.notnull(x):
      ...:         d =  {x.split(':')[0]:x.split(':')[1] for x in x.split('|||')}
      ...:         vals = d.keys()
      ...:         data.extend(vals)
      ...:         
      ...: print list(set(data))
      ['Style', 'Material', 'Number of Items', 'Pattern', .....
      

      【讨论】:

        【解决方案3】:

        以下代码应该可以工作:

        df_new = df['variations'].apply(lambda x: pd.Series({x.split(':')[0]:x.split(':')[1] for x in x.split('|||')}) if pd.notnull(x) else '')
        

        df_new 的列名是唯一的。

        【讨论】:

          猜你喜欢
          • 2016-07-01
          • 2019-08-10
          • 2018-08-28
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 2018-10-26
          • 2015-12-10
          • 2018-04-30
          相关资源
          最近更新 更多