#python
Вопрос:
У меня есть следующий фрейм данных в Python с именем «final».
дата покупки_дата | Дата истечения срока годности | is_trial_период | текущая дата |
---|---|---|---|
2013-10-12. | 2013-12-12 | ложный | 2021-10-06. |
2013-10-12 | 2013-12-12 | ложный | 2021-10-06. |
2021-10-04 | 2021-11-04. | истинный | 2021-10-06. |
Типы данных конечного кадра данных являются
purchase_date:datetime64[ns]
,Expiration_date:datetime64[ns]
,is_trial_period:object
,current_date:datetime64[ns],
dtype: object
Я хочу создать новый столбец под названием XYZ.
- Если значение is_trail_period равно FALSE amp; Дата истечения срока действия >= текущая дата, значение столбца XYZ должно быть «Активная подписка», иначе «Срок действия подписки истек».
- Если значение is_trail_period равно TRUE amp; Дата истечения срока действия >= текущая дата, значение столбца XYZ должно быть «Активная ПРОБНАЯ версия», иначе «ПРОБНАЯ версия с истекшим сроком действия».
Как я могу это сделать на Python ??
Я пытался сделать
def func(row):
if ((bool(final['is_trial_period'])== 'FALSE') amp; (final['Expiration_date'] >= final['current_date'])):
return 'Active Subscription'
elif ((bool(final['is_trial_period'])== 'FALSE') amp; (final['Expiration_date'] < final['current_date'])):
return 'Expired Subscription'
elif ((bool(final['is_trial_period'])== 'TRUE') amp; (final['Expiration_date'] >= final['current_date'])):
return 'Active Trial'
elif ((bool(final['is_trial_period'])== 'FALSE') amp; (final['Expiration_date'] < final['current_date'])):
return 'Expired Trial'
final['XYZ'] = final.apply(func, axis=1)
Но тогда я получаю ошибку
«Ошибка значения: Значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all().»
Я хочу, чтобы мой конечный результат был таким
дата покупки_дата | Дата истечения срока годности | is_trial_период | текущая дата. | XYZ |
---|---|---|---|---|
2013-10-12 | 2013-12-12 | ложный | 2021-10-0 | Срок действия Подписки истек |
2013-10-12 | 2013-12-12 | ложный | 2021-10-06 | Срок действия Подписки истек |
2021-10-04 | 2021-11-04 | истинный | 2021-10-06 | Активная Пробная версия |
Комментарии:
1. если возможно, поделитесь фреймом данных
2. «Окончательный» фрейм данных-это таблица выше без столбцов XYZ. Я не знаю, почему я не могу получить его в табличном формате в начале вопроса. @Сабил
3. @Sabil Ты получил это
4. Пожалуйста, поделитесь final.to_dict() для удобства других.
5. да, я понял. проверьте мой ответ
Ответ №1:
Ты должен позвонить row
вместо final
этого . Также удалите ненужное bool
преобразование, и все готово к работе.
Попробуй это:
import pandas as pd
data = {
'purchase_date': ['2013-10-12', '2013-10-12', '2021-10-04'],
'expiration_date': ['2013-12-12', '2013-12-12', '2021-11-04'],
'is_trial_period': ['FALSE', 'FALSE', 'TRUE'],
'current_date': ['2021-10-06', '2021-10-06', '2021-10-06']
}
def func(row):
if row['is_trial_period'] == 'FALSE' and row['expiration_date'] >= row['current_date']:
return 'Active Subscription'
elif row['is_trial_period'] == 'FALSE' and row['expiration_date'] < row['current_date']:
return 'Expired Subscription'
elif row['is_trial_period']== 'TRUE' and row['expiration_date'] >= row['current_date']:
return 'Active Trial'
elif row['is_trial_period'] == 'FALSE' and row['expiration_date'] < row['current_date']:
return 'Expired Trial'
final = pd.DataFrame(data)
final['XYZ'] = final.apply(func, axis=1)
print(final)
Выход:
purchase_date expiration_date is_trial_period current_date XYZ
0 2013-10-12 2013-12-12 FALSE 2021-10-06 Expired Subscription
1 2013-10-12 2013-12-12 FALSE 2021-10-06 Expired Subscription
2 2021-10-04 2021-11-04 TRUE 2021-10-06 Active Trial
Ответ №2:
Вот как это сделать: во-первых, я немного очистил ваш фрейм данных. Убрал . after current_date
и исправил current_date
значение в первой строке, так как день не указан.
final["XYZ"] = ""
for index in final.index:
if (final.loc[index, "is_trial_period"] == False) amp; (final.loc[index,"Expiration_date"] >= final.loc[index,"current_date"]):
final.loc[index,"XYZ"] = "Active Subscription"
elif (final.loc[index, "is_trial_period"] == False) amp; (final.loc[index,"Expiration_date"] < final.loc[index,"current_date"]):
final.loc[index,"XYZ"] = "Expired Subscription"
elif (final.loc[index, "is_trial_period"] == True) amp; (final.loc[index,"Expiration_date"] >= final.loc[index,"current_date"]):
final.loc[index,"XYZ"] = "Active Trial"
else:
final.loc[index,"XYZ"] = "Expired Trial"
final
Результаты выглядят так:
purchase_date Expiration_date is_trial_period current_date XYZ
0 2013-10-12 2013-12-12 False 2021-10-06 Expired Subscription
1 2013-10-12 2013-12-12 False 2021-10-06 Expired Subscription
2 2021-10-04 2021-11-04 True 2021-10-06 Active Trial
Ответ №3:
Я обычно буду использовать df.loc
для решения подобных проблем.
final.loc[(final['is_trial_period'] == 'FALSE') amp; (final['expiration_date'] >= final['current_date']), 'XYZ'] = 'Active Subscription'
final.loc[(final['is_trial_period'] == 'FALSE') amp; (final['expiration_date'] < final['current_date']), 'XYZ'] = 'Expired Subscription'
final.loc[(final['is_trial_period'] == 'TRUE') amp; (final['expiration_date'] >= final['current_date']), 'XYZ'] = 'Active Trial'
final.loc[(final['is_trial_period'] == 'TRUE') amp; (final['expiration_date'] < final['current_date']), 'XYZ'] = 'Expired Trial'
Комментарии:
1. Это мой Панд способ обработки новых столбцов…вообще говоря.