Dataframe 如何使用一条np.where语句将数据框A的3列更新为数据框B的3列

Dataframe 如何使用一条np.where语句将数据框A的3列更新为数据框B的3列,dataframe,numpy,array-broadcasting,Dataframe,Numpy,Array Broadcasting,在下面的代码中,我创建了具有每日数据的df_d,以及具有5分钟间隔的日内数据的df_I 我在dfu d中有3列(卷、卷1和卷2),我想将它们传播到dfu I,以用于各自的日期 当我调用df\u I,df\u d=main\u process()时,代码就会得到结果。但是,当我在大数据上运行它时,这会占用很多时间 如何仅用一条np.where语句更新df_I的3列?或者说,实现这一目标的最快方法是什么 import pandas as pd import numpy as np import da

在下面的代码中,我创建了具有每日数据的df_d,以及具有5分钟间隔的日内数据的df_I

我在dfu d中有3列(卷、卷1和卷2),我想将它们传播到dfu I,以用于各自的日期

当我调用
df\u I,df\u d=main\u process()
时,代码就会得到结果。但是,当我在大数据上运行它时,这会占用很多时间

如何仅用一条np.where语句更新df_I的3列?或者说,实现这一目标的最快方法是什么

import pandas as pd
import numpy as np
import datetime

def dt_to_integer( dt_time):
    return 10000*dt_time.year + 100*dt_time.month + dt_time.day

def main_process():
 
    todays_date = datetime.datetime.now().date()
    index = pd.date_range( todays_date, periods=5, freq='D')
     
    columns = [ 'Volume', 'Volume1', 'Volume2']
     
    df_d = pd.DataFrame( index=index, columns=columns)
    df_d[ 'Volume'] = df_d.index.day * 100
    df_d[ 'Volume1'] = df_d.index.day * 500
    df_d[ 'Volume2'] = df_d.index.day * 1000

    todays_date = datetime.datetime.now().date()
    index = pd.date_range( todays_date, periods=1440, freq='5min')
     
    columns = [ 'Volume', 'Volume1', 'Volume2']
     
    df_i = pd.DataFrame( index=index, columns=columns)
    df_i = df_i.loc[ df_i.index.isin( df_i.between_time('09:30:00', '16:00:00').index)]
     
    for i in range( len( df_d)):
        the_date = dt_to_integer( df_d.index[i])
        
        df_i.Volume = np.where( dt_to_integer( df_i.index) == the_date, df_d.Volume[ i], df_i.Volume)
        df_i.Volume1 = np.where( dt_to_integer( df_i.index) == the_date, df_d.Volume1[ i], df_i.Volume1)
        df_i.Volume2 = np.where( dt_to_integer( df_i.index) == the_date, df_d.Volume2[ i], df_i.Volume2)
        
    return df_i, df_d

df_i, df_d = main_process()

问题是,对于范围内i(len(df_d))的更新
每次迭代都要更新完整的数据帧,因此复杂性是
n1*n2
。可以改进结果的方法是使用查找插入索引,将
df_d
中的值插入
df_i
,然后在插入索引与现有索引相同的位置更新
df_i


def主流程2(n1=5,n2=1440):
todays\u date=datetime.datetime.now().date()
索引=pd.日期\范围(今天\日期,周期=5,频率=D')
列=['卷'、'卷1'、'卷2']
数据帧(索引=索引,列=列)
df_d[“卷”]=df_d.index.day*100
df_d['Volume1']=df_d.index.day*500
df_d['Volume2']=df_d.index.day*1000
todays\u date=datetime.datetime.now().date()
索引=pd.日期\范围(今天\日期,周期=1440,频率=5分钟)
列=['卷'、'卷1'、'卷2']
df_i=pd.DataFrame(索引=索引,列=列)
df_i=df_i.loc[df_i.index.isin(df_i.between_time('09:30:00','16:00:00').index)]
日期=np.sort(dt_到整数(df_d.index))
索引=np.searchsorted(日期,dt到整数(df_i.index))
#将为索引器DFU d提供df_i中不存在的索引
df_i.Volume=np.式中(dt_to_integer(df_i.index)=日期[指数],df_d.Volume[指数],df_i.Volume)
df_i.Volume1=np.式中(dt_to_integer(df_i.index)=日期[索引]、df_d.Volume1[索引]、df_i.Volume1)
df_i.Volume2=np.式中(dt_to_integer(df_i.index)=日期[索引]、df_d.Volume2[索引]、df_i.Volume2)
返回df_i,df_d
正确性 我使用

df_i, df_d = main_process()
df_i2, df_d2 = main_process2()
assert(np.max(np.abs(np.array(df_d) - np.array(df_d2))) == 0)
assert(np.max(np.abs(np.array(df_i) - np.array(df_i2))) == 0)
当地人 稍微不同的实现


#将为索引器DFU d提供df_i中不存在的索引
df_i.Volume[the_updated]=np.array(df_d.Volume[the_index[the_updated]]
df_i.Volume1[the_updated]=np.array(df_d.Volume1[the_index[the_updated]]
df_i.Volume2[the_updated]=np.array(df_d.Volume2[the_index[the_updated]]
或者一次线性更新所有列

df_i.iloc[the_updated,:]=df_d.iloc[the_index[the_updated],:]
演出 在建议的更改之后,
main_进程2(5014400)
,输入比您的示例大10倍,运行时间为10-15毫秒,而
main_进程(5014400)
运行时间约为13.5秒