Pandas 将同一数据框中两列中的字符串与条件输出进行比较到新列

我在包含字符串的数据框中有两列。例如,


import pandas as pd

import numpy as np


data = [['Oct-2019', 'Oranges + Grapes + Pears', 'Grapes + Pears'],

       ['Nov-2019', 'Oranges + Grapes + Pears', 'Oranges + Grapes + Pears']]


df = pd.DataFrame(data, columns =['Date', 'Previous shopping list', 'Recent shopping list'])

print(df)


Fish = ['Salmon', 'Trout']

Fruit = ['Oranges', 'Grapes', 'Pears']


     Date     PSL                 RSL

0  Oct-2019   Oranges + Grapes    Grapes + Pears

              + Pears + Salmon                     


1  Nov-2019   Oranges + Grapes    Oranges + Grapes

              + Pears + Trout     + Pears  

我想比较两列中的字符串,并将文本输出到一个新列,该列说明两个列表之间发生了什么变化。例如,创建一个列,该列将检查与“水果”相关的字符串,并输出与上一个列表之前的购物列表相比,从最近的购物中删除了哪些水果。请参阅下面的所需输出:


     Date     PSL                 RSL               Fruit lost   Fish Lost

0  Oct-2019   Oranges + Grapes    Grapes + Pears    Oranges      Salmon

              + Pears + Salmon                     


1  Nov-2019   Oranges + Grapes    Oranges + Grapes               Trout

              + Pears + Trout     + Pears  

在使用熊猫时我怎么能做到这一点!抱歉,如果这是第一次不清楚!


感谢您的任何建议/帮助!


慕莱坞森
浏览 167回答 3
3回答

哔哔one

检查“最近的购物清单”中是否存在字符串“Oranges”并根据结果创建一个新列“Oranges Lost”:df['Oranges Lost'] = np.where(df['Recent shopping list'].str.contains('Oranges'), 'No Change', 'Lost')```

扬帆大鱼

用于处理数据的确切函数取决于每个组合所需的确切输出。希望下面会给您足够的信息来为您的问题创建解决方案:# process data so each row contains a list of elementsdf['PSL_processed'] = df['Previous shopping list'].str.split('+')df['RSL_processed'] = df['Recent shopping list'].str.split('+')def compare_items(x):    if set(x.PSL_processed) == set(x.RSL_processed):        return 'No change'    elif set(x.PSL_processed) - set(x.CSL_processed) > 0:        return 'Lost'    # add in conditional logic here, to meet specificationdf.apply(compare_items, axis=1)的官方文档pd.apply()写得很好。

LEATH

所以马克的解决方案很好地抓住了列表之间的差异# process data so each row contains a list of elementsdf['PSL_processed'] = df['Previous shopping list'].str.split()df['RSL_processed'] = df['Recent shopping list'].str.split()def compare_items(x):    return set(x.PSL_processed) - set(x.RSL_processed)    # add in conditional logic here, to meet specificationdf['Products_lost'] = df.apply(compare_items, axis=1)print(df)除此之外,为了找到=水果和产品=鱼的产品,我使用了以下内容:for idx, row in df.iterrows():    for c in Fruit:        if c in row['Products_lost']:            df.ix[idx, 'Fruit lost'] = c            for c in Fish:                if c in row['Products_lost']:                    df.ix[idx, 'Fish lost'] = c似乎运作良好!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python