我有一个[日期,值]数据框(下面的代码中为ash_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的解决方案效率不高。
答案 0 :(得分:0)
不确定您交易的数据类型是什么,我假设它是一个序列,如果是字典,您可以将其转换为序列。
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)
答案 1 :(得分:0)
我认为您可能正在寻找DataFrame.add()pandas.DataFrame.add
例如
cash_movement_df = cash_movement_df.set_index(['Date']).add(transaction.set_index(['Date']), fill_value=0).reset_index()