Суммировать данные из одного фрейма данных в другой

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

В моей работе у меня есть два DataFrames. Первый, называемый 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, если в столбце reject_purchase фрейма данных df_cart_historic есть хотя бы одно вхождение значения Y, или ноль, если нет вхождения Y для card_id
  2. столбец 'oldest_Date', значением которого является самая старая дата в столбце Purchase_date df_cart_historic
  3. 'max_installments', которое является максимальным значением столбца платежей в df_cart_historic.
  4. 'max_month_lag', которое является максимальным значением столбца month_lag в df_cart_historic.

Эй, Анджело, можете ли вы предоставить образец ваших наборов данных и ожидаемый результат? людям будет намного легче помочь вам таким образом.

Umar.H 22.06.2019 19:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно использовать 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

Большое спасибо Валентино. Я пытался использовать всеобъемлющий дикт.

Ângelo 22.06.2019 21:47

Возможно, вы тоже можете сделать это, но использование методов pandas обычно быстрее. Если вам нужно работать с большими данными, это решение также должно быть эффективным.

Valentino 22.06.2019 21:52

Другие вопросы по теме