Сравнение столбцов фрейма данных и добавление еще двух столбцов в фрейм данных на основе сравнения в Python Pandas

#python #pandas #dataframe

#питон #pandas #фрейм данных

Вопрос:

У меня есть такой фрейм данных, как этот:

  category    uid sales_1 sales_2
0    Grocery     1   XX   XX
1    Grocery     2   XX   ZZ
2    Sports      3   XX   ZZ
3    Grocery     4   ZZ   XX
4    Beauty      5   ZZ   ZZ
5    Beauty      6   ZZ   ZZ
6    Sports      7   ZZ   XX
7    Grocery     8   ZZ   XX
...
 

Мне нужно сравнить столбец sales_1 со столбцом sales_2. Результат сравнения будет отражен в 2 новых столбцах, первом и втором. Если sales_1 == sales_2, то значения в этих 2 новых столбцах должны быть «без изменений» и «ОК». Если sales_1 != sales_2, значения должны быть «изменены» и «пробел».
В конце я хотел бы иметь следующий фрейм данных:

  category    uid sales_1 sales_2  first     second
0    Grocery     1   XX   XX    no changes  OK
1    Grocery     2   XX   ZZ    changed     gap
2    Sports      3   XX   ZZ    changed     gap
3    Grocery     4   ZZ   XX    changed     gap
4    Beauty      5   ZZ   ZZ    no changes  OK
5    Beauty      6   ZZ   ZZ    no changes  OK
6    Sports      7   ZZ   XX    changed     gap
7    Grocery     8   ZZ   XX    changed     gap
...
 

Я был бы очень признателен за любое предложение.

Ответ №1:

Вы можете использовать where() функцию из numpy:

 df['first'] = np.where(df.sales_1 == df.sales_2, 'no changes', 'changed')
df['second'] = np.where(df.sales_1 == df.sales_2, 'OK', 'gap')
 

Ответ №2:

Сначала вы можете присвоить first столбцам и значение по умолчанию second , а затем применить фильтрацию по условию, изменились ли продажи.

 
import pandas as pd

df = pd.DataFrame(
    {
        'category': ['Grocery', 'Sports', 'Beauty'],
        'sales_1': ['XX', 'ZZ', 'XX'],
        'sales_2': ['XX', 'XY', 'ZZ'],
    }
)

changed_sales = df['sales_1'] != df['sales_2']

df['first'] = 'no changes'
df.loc[changed_sales, 'first'] = 'changed'
df['second'] = 'OK'
df.loc[changed_sales, 'second'] = 'gap'

print(df)
 

Вывод

   category sales_1 sales_2       first second
0  Grocery      XX      XX  no changes     OK
1   Sports      ZZ      XY     changed    gap
2   Beauty      XX      ZZ     changed    gap
 

Ответ №3:

вы можете использовать понимание списка

 df['first']= ["no changes" if s1 == s2 else "changed" for (s1, s2) in zip(df['sales_1'], df['sales_2']) ]
df['second'] = ["OK" if s1 == s2 else "gap" for (s1, s2) in zip(df['sales_1'], df['sales_2']) ]