Создание новых столбцов из существующих в Python

#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.

  1. Если значение is_trail_period равно FALSE amp; Дата истечения срока действия >= текущая дата, значение столбца XYZ должно быть «Активная подписка», иначе «Срок действия подписки истек».
  2. Если значение 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. Это мой Панд способ обработки новых столбцов…вообще говоря.