Обновите строку, вставьте новую строку, если она отсутствует - PullRequest
0 голосов
/ 28 января 2019

У меня есть фрейм данных [Date, Value] (cash_movement_df в приведенном ниже коде).Где значения необходимо обновить (суммировать) для дат.Если дата еще не присутствует в фрейме данных, вставьте ее как новую строку [дата, значение].

Я попытался использовать следующий код, но искал что-то более эффективное.

date = transaction['date'].iat[0]
value = transaction['value'].iat[0]

mask = cash_movement_df['date']==date
if cash_movement_df.loc[mask]['value'].any(): 
    cash_movement_df.loc[mask, 'value'] += value
else: 
    cash_movement_df.loc[-1] = [date, value]
    cash_movement_df.index = cash_movement_df.index + 1

Примерввод-вывод:

cash_movement_df = pd.DataFrame({'date': ['2019-01-01', '2019-01-02'], 'value': [1, 2]})
transaction = pd.DataFrame({'date': ['2019-01-03'], 'value': [3]})

    date    value
2019-01-01  1.0000
2019-01-02  2.0000
2019-01-03  3.0000

transaction = pd.DataFrame({'date': ['2019-01-02'], 'value': [3]})

   date     value
2019-01-01  1.0000
2019-01-02  5.0000

Ищем более элегантное решение.Обратите внимание, что cash_movement_df имеет большой размер, и транзакция по 1 за раз.Поэтому я считаю, что решение, которое делает копию cash_movement_df, неэффективно.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Я думаю, что, возможно, вы ищете DataFrame.add () pandas.DataFrame.add

Например,

cash_movement_df = cash_movement_df.set_index(['Date']).add(transaction.set_index(['Date']), fill_value=0).reset_index()
0 голосов
/ 28 января 2019

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

import pandas as pd

cash_movement_df = pd.DataFrame({'date': ['2019-01-01', '2019-01-02'], 'value': [1, 2]})
transaction = pd.Series({'date': '2019-01-03', 'value': 3})

# **** sthe following is your codes

# mask = cash_movement_df['date'] == transaction['date']
# if cash_movement_df.loc[mask]['value'].any():
#     cash_movement_df.loc[mask, 'value'] += transaction['value']
# else:
#     cash_movement_df.loc[-1] = [transaction['date'], transaction['value']]
#     cash_movement_df.index = cash_movement_df.index + 1
#

# **** the following is mine
transactions = transaction.to_frame().T

res = pd.merge(cash_movement_df, transactions, how='outer', on='date')
res['value_x'].fillna(0, inplace=True)
res['value_y'].fillna(0, inplace=True)
res['value'] = res['value_x'] + res['value_y']
cash_movement_df = res.drop(['value_x', 'value_y'], axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...