更新一行,如果缺少则插入新行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新一行,如果缺少则插入新行相关的知识,希望对你有一定的参考价值。

我有一个[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副本的解决方案效率不高。

答案

不确定你的交易的数据类型是什么,我认为它是一个系列,如果它是一个字典,你可以将它转换成一个序列。

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)
另一答案

我想也许你正在寻找DataFrame.add()pandas.DataFrame.add

EG

cash_movement_df = cash_movement_df.set_index(['Date']).add(transaction.set_index(['Date']), fill_value=0).reset_index()

以上是关于更新一行,如果缺少则插入新行的主要内容,如果未能解决你的问题,请参考以下文章

如果存在则更新,否则插入[重复]

如何在一个查询中插入和更新

自动插入新行

如何使用 ASP.NET OLEDB 向数据库中添加一行?

如果存在则更新行否则使用实体框架插入逻辑[关闭]

如果找不到,MySQL“好”的方式插入一行,如果找到则更新它