#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']) ]