Суммируйте данные из одного кадра данных в другой - PullRequest
0 голосов
/ 22 июня 2019

Я бы хотел помочь вам в следующем.

В моей работе у меня есть два кадра данных. Первый, называемый df_card_features, имеет функции карты, а столбец card_id содержит уникальный идентификатор каждой карты. Второй, называемый df_cart_historic, содержит данные карты из первого кадра данных; во втором кадре данных столбец card_id не имеет уникальных значений, но совпадает со столбцом card_id первого кадра данных.

В качестве решения я подумал о создании словаря и последующем включении столбцов в фрейм данных, но это предложение кажется мне очень затратным с точки зрения производительности, поскольку файл истории CSV имеет около 5 ГБ.

# card features:
card_id = ['card_a', 'card_b', 'card_c', 'card_d', 'card_e']
date_activation = ['2019-02-01', '2019-05-02', '2018-01-20', '2015-07-23', '2013-07-23']
feature_1_1 = [0, 1, 1, 1, 0]
feature_1_2 = [1, 0, 0, 0, 1]
df_card_features = pd.DataFrame()
df_card_features['card_id'] = card_id
df_card_features['date_activation'] = date_activation
df_card_features['feature_1_1'] = feature_1_1
df_card_features['feature_1_2'] = feature_1_2;
df_card_features.head()


# card historic
card_id = ['card_a', 'card_b', 'card_c', 'card_d', 'card_e', 'card_a', 'card_b', 'card_c', 'card_d', 'card_e', 'card_a', 'card_b', 'card_c', 'card_d', 'card_e']
denied_purchase = ['N', 'Y', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'Y', 'N', 'Y', 'N', 'N', 'Y']
purchase_date = ['2019-02-01', '2019-02-01', '2019-02-01', '2019-02-01', '2019-02-01', '2019-02-10', '2019-02-11', '2019-02-21', '2019-03-01', '2019-03-01', '2019-03-01', '2019-03-31', '2018-04-01', '2016-02-01', '2013-12-01']
installments = [0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 8, 4, 0 ]
month_lag = [0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5]
df_cart_historic = pd.DataFrame()
df_cart_historic['card_id'] = card_id
df_cart_historic['denied_purchase'] = denied_purchase
df_cart_historic['purchase_date'] = purchase_date
df_cart_historic['installments'] = installments
df_cart_historic['month_lag'] = month_lag

Мне нужно создать следующие столбцы в кадре данных df_card_features:

  1. столбец 'denied_purchase?' Чье значение равно 1, если в столбце denied_purchase столбца данных df_cart_historic есть хотя бы одно вхождение значения Y, или ноль, если для card_id * вхождения нет вхождения Y
  2. столбец 'old_Date', значение которого является самой старой датой в столбце purchase_date df_cart_historic
  3. 'max_installments', который является максимальным значением столбца рассрочки платежа df_cart_historic
  4. 'max_month_lag', который является максимальным значением столбца month_lag в df_cart_historic.

1 Ответ

2 голосов
/ 22 июня 2019

Yoy необходимо использовать groupby для 'card_id' столбца в df_cart_historic, чтобы строить новые столбцы, используя только те строки, где 'card_id' имеет одинаковое значение.
Вызывая groupby('card_id').apply(func), вы можете использоватьпользовательская функция func, которая выполняет эту работу.

Вот рабочий пример:

import pandas as pd

# card features:
card_id = ['card_a', 'card_b', 'card_c', 'card_d', 'card_e']
date_activation = ['2019-02-01', '2019-05-02', '2018-01-20', '2015-07-23', '2013-07-23']
feature_1_1 = [0, 1, 1, 1, 0]
feature_1_2 = [1, 0, 0, 0, 1]
df_card_features = pd.DataFrame()
df_card_features['card_id'] = card_id
df_card_features['date_activation'] = pd.to_datetime(date_activation) #converting to datetime
df_card_features['feature_1_1'] = feature_1_1
df_card_features['feature_1_2'] = feature_1_2;
df_card_features.head()


# card historic
card_id = ['card_a', 'card_b', 'card_c', 'card_d', 'card_e', 'card_a', 'card_b', 'card_c', 'card_d', 'card_e', 'card_a', 'card_b', 'card_c', 'card_d', 'card_e']
denied_purchase = ['N', 'Y', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'Y', 'N', 'Y', 'N', 'N', 'Y']
purchase_date = ['2019-02-01', '2019-02-01', '2019-02-01', '2019-02-01', '2019-02-01', '2019-02-10', '2019-02-11', '2019-02-21', '2019-03-01', '2019-03-01', '2019-03-01', '2019-03-31', '2018-04-01', '2016-02-01', '2013-12-01']
installments = [0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 8, 4, 0 ]
month_lag = [0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5]
df_cart_historic = pd.DataFrame()
df_cart_historic['card_id'] = card_id
df_cart_historic['denied_purchase'] = denied_purchase
df_cart_historic['purchase_date'] = pd.to_datetime(purchase_date) #converting to datetime
df_cart_historic['installments'] = installments
df_cart_historic['month_lag'] = month_lag

df_card_features.set_index('card_id', inplace=True) #using card_id column as index

def getnewcols(x):
    res = pd.DataFrame()
    res['denied_purchase?'] = pd.Series(['Y' if 'Y' in x['denied_purchase'].unique() else 'N'])
    res['oldest_Date'] = x['purchase_date'].min()
    res['max_installments'] = x['installments'].max()
    res['max_month_lag'] = x['month_lag'].max()
    return res

newcols = df_cart_historic.groupby('card_id').apply(getnewcols)
newcols = newcols.reset_index().drop('level_1', axis=1).set_index('card_id')
df_card_features_final = pd.concat([df_card_features, newcols], axis=1)

Обратите внимание, что столбец с датами анализируется с pandas.to_datetime, чтобы получить datetimeобъекты вместо простых строк (очень удобно для работы с датами).
newcols - это кадр данных, содержащий новые столбцы, df_card_features_final - это конечный кадр данных со всеми столбцами:

        date_activation  feature_1_1  feature_1_2 denied_purchase? oldest_Date  max_installments  max_month_lag
card_id                                                                                                        
card_a       2019-02-01            0            1                N  2019-02-01                 0              0
card_b       2019-05-02            1            0                Y  2019-02-01                 0              0
card_c       2018-01-20            1            0                N  2018-04-01                 8              0
card_d       2015-07-23            1            0                Y  2016-02-01                 4              0
card_e       2013-07-23            0            1                Y  2013-12-01                 5              5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...