繁体   English   中英

从 dataframe 中提取特定的单词

[英]Extract specific words from dataframe

我有以下名为 dataframe 的 marketing,我想从其中提取 source= 从值中。 有没有办法创建一个通用的正则表达式 function 以便我可以应用于其他列以及提取等号后的单词?

Data      
source=book,social_media=facebook,ads=Facebook
source=book,ads=Facebook,customer=2
cost=2, customer=3            

我正在使用 python 并且我尝试了以下操作:

df = pd.DataFrame()
def find_keywords(row_string):
    tags = [x for x in row_string if x.startswith('source=')]
    return tags
df['Data'] = marketing['Data'].apply(lambda row : find_keywords(row)) 

我可以知道是否有更有效的方法来提取和放入列中:

source  social_media  ads  customer costs
book     facebook     facebook -    -
book      -           facebook 2    -

您可以将字符串类型的列值拆分为字典,然后使用pd.json_normalize将字典转换为列。

out = pd.json_normalize(marketing['Data'].apply(lambda x: dict([map(str.strip, i.split('=')) for i in x.split(',')]))).dropna(subset='source')
print(out)

  source social_media       ads customer cost
0   book     facebook  Facebook      NaN  NaN
1   book          NaN  Facebook        2  NaN

这是另一种选择:

样本 dataframe marketing是:

marketing = pd.DataFrame(
    {"Data": ["source=book,social_media=facebook,ads=Facebook",
              "source=book,ads=Facebook,customer=2",
              "cost=2, customer=3"]}
)
                                             Data
0  source=book,social_media=facebook,ads=Facebook
1             source=book,ads=Facebook,customer=2
2                              cost=2, customer=3

现在这个

result = (marketing["Data"].str.split(r"\s*,\s*").explode().str.strip()
          .str.split(r"\s*=\s*", expand=True).pivot(columns=0))

确实生产

          1                                  
0       ads cost customer social_media source
0  Facebook  NaN      NaN     facebook   book
1  Facebook  NaN        2          NaN   book
2       NaN    2        3          NaN    NaN

这几乎就是您要查找的内容,除了额外的列级别和列排序。 所以进行如下修改

result = (marketing["Data"].str.split(r"\s*,\s*").explode().str.strip()
          .str.split(r"\s*=\s*", expand=True).rename(columns={0: "columns"})
          .pivot(columns="columns").droplevel(level=0, axis=1))
result = result[["source", "social_media", "ads", "customer", "cost"]]

应该解决这个问题:

columns source social_media       ads customer cost
0         book     facebook  Facebook      NaN  NaN
1         book          NaN  Facebook        2  NaN
2          NaN          NaN       NaN        3    2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM