Pandas сравнивает строки в двух столбцах в одном и том же кадре данных с условным выводом в новый столбец - PullRequest
0 голосов
/ 22 января 2020

У меня есть два столбца в кадре данных, содержащих строки. Например,

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  

Как бы я смог добиться этого при использовании pandas! Извиняюсь, если это не было ясно в первый раз!

Спасибо за любое предложение / помощь!

Ответы [ 3 ]

1 голос
/ 23 января 2020

Чтобы проверить, существует ли строка «Апельсины» в «Списке недавних покупок», и создать новый столбец «Потерянные апельсины» на основе результата:

df['Oranges Lost'] = np.where(df['Recent shopping list'].str.contains('Oranges'), 'No Change', 'Lost')``` 
1 голос
/ 23 января 2020

Точная функция, которую вы используете для обработки данных, зависит от вашего точного вывода, который вам требуется для каждой комбинации. Надеюсь, что ниже приведено достаточно для создания решения вашей проблемы:

# process data so each row contains a list of elements
df['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 specification

df.apply(compare_items, axis=1)

Официальная документация для pd.apply() написана хорошо.

0 голосов
/ 23 января 2020

Так что решение Марка хорошо работает, чтобы захватить разницу между списками

# process data so each row contains a list of elements
df['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 specification
df['Products_lost'] = df.apply(compare_items, axis=1)

print(df)

Кроме того, чтобы найти продукты, которые = фрукты и продукты = фи sh Я использовал следующее:

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

Кажется, хорошо работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...