Python 根据“从多个数据帧乘以值中创建多个数据帧”;“基础”-字典

Python 根据“从多个数据帧乘以值中创建多个数据帧”;“基础”-字典,python,pandas,dictionary,Python,Pandas,Dictionary,我得到了一个数据帧字典,dataframes,它是基于时间的配置文件,每个时间点的值为x和y。下面显示了字典和该字典的一个数据帧 dataframes={'SG1':Dataframe'SG2':Dataframe'SG3':Dataframe'SG4':Dataframe'SG5':Dataframe} 日期 时间 值x y值 01.01.2018 0:00 0.45 0.11 01.01.2018 0:15 0.42 0.20 如果所有数据帧的日期和时间都相同,则可以在一个for循环中执行此

我得到了一个数据帧字典,
dataframes
,它是基于时间的配置文件,每个时间点的值为
x
y
。下面显示了字典和该字典的一个数据帧

dataframes={'SG1':Dataframe'SG2':Dataframe'SG3':Dataframe'SG4':Dataframe'SG5':Dataframe}

日期 时间 值x y值 01.01.2018 0:00 0.45 0.11 01.01.2018 0:15 0.42 0.20
如果所有数据帧的日期和时间都相同,则可以在一个for循环中执行此操作,迭代
base_dict
的键和值,并在
dataframes2
中为每个键创建一个条目:

for area, vals in base_dict.items():
    df_keys = list(vals.keys())
    dataframes2[area] = pd.DataFrame({'Date': dataframes[df_keys[0]].Date, 
                                      'Time': dataframes[df_keys[0]].Time, 
                                      'value x': dataframes[df_keys[0]]['value x']*vals[df_keys[0]] + dataframes[df_keys[1]]['value y']*vals[df_keys[1]], 
                                      'value y': accordingly
如果时间戳不同,您可以使用类似的方法,但不只是创建新的数据帧,您需要使用合并

编辑:我们在评论中对此进行了讨论,但由于我无法在那里发布代码示例,下面是我的代码的一个完整的最小示例,它不返回1x1数据帧:

df1 = pd.DataFrame({'x': range(5), 'y': range(5, 10), 'Date': pd.date_range(start='1/1/2018', periods=5)})
df2 = pd.DataFrame({'x': range(10,15), 'y': range(15,20), 'Date': pd.date_range(start='1/1/2018', periods=5)})
dataframes2 = {}
dataframes={'SG1': df1, 'SG2': df2}
base_dict={'area1':{'SG1':0.0,'SG2':1.0}, 'area2':{'SG1':1.0,'SG2':0.0}}
for area, vals in base_dict.items():
    df_keys = list(vals.keys())
    dataframes2[area] = pd.DataFrame({'Date': dataframes[df_keys[0]].Date, 
                                      'value x': dataframes[df_keys[0]]['x']*vals[df_keys[0]] + dataframes[df_keys[1]]['y']*vals[df_keys[1]]})
结果:

{'area1':         Date  value x
 0 2018-01-01     15.0
 1 2018-01-02     16.0
 2 2018-01-03     17.0
 3 2018-01-04     18.0
 4 2018-01-05     19.0,
 'area2':         Date  value x
 0 2018-01-01      0.0
 1 2018-01-02      1.0
 2 2018-01-03      2.0
 3 2018-01-04      3.0
 4 2018-01-05      4.0}

事实上,这里甚至可以使用理解。诀窍在于,您可以对完整的数据帧使用操作,只要它们具有相同的索引和列。因此,如果在索引中隐藏
日期
时间
列,一切正常:

dataframes2 ={k: sum(dataframes[name].set_index(['Date ', 'Time ']) * coeff 
                     for name, coeff in d.items()).reset_index()
              for k,d in base_dict.items()}

注:这是基于Darina的回答。因为这似乎是我在评论中的一个不同的答案。我更改了代码,因为Darina的答案是创建了一个series对象,数据帧的大小为1*1,这不是本文的目标

`for area, vals in base_dict.items():
  df_keys = list(vals.keys())
    d=dataframes[df_keys[0]]['Date']
    t=dataframes[dfs_keys[0]]['Time']
    x=dataframes[df_keys[0]]['value x']*vals[df_keys[0]] + dataframes[df_keys[1]]['value x']*vals[df_keys[1]]
    y=dataframes[df_keys[0]]['value y']*vals[df_keys[0]] + dataframes[df_keys[1]]['value y']*vals[df_keys[1]]
    dataframes2[area] = pd.concat([d.to_frame(name='Date'),t.to_frame(name='Time'),x.to_frame(name='value x'),y.to_frame(name='value y')], axis=1)` 

我避免了
.Date
.Time
,因为
'Date'
'Time'
值的数据类型不是
datetime

区域变量从何而来?应用该变量时,我得到错误:TypeError:'dict\u keys'对象不支持索引是的,我的错,您需要先将
df_键
转换为列表。我已经编辑了我的原始答案。例如,我使用了索引1和索引2。如果数据帧的大小为(96,4),您将如何更改?(如果这是一个愚蠢的问题,请回答)索引用于字典中的键,而不是数据帧中的键。尝试运行循环并打印<代码> DFYKEYS/<代码>的值。如果我的答案是有用的,请考虑接受或接受。这看起来是一个非常巧妙的解决方案。但是,日期和时间需要单独存储在数据框中,因为此表单对于在其他软件中导入很重要。无论如何,是否可以使用对象类型作为索引?(时间和日期存储为对象。即使这不好,也有原因)谢谢!我的代码包含一个
reset_索引
,原因是:在操作后,日期和时间会返回普通列,并且
dataframe2
中的数据帧与
dataframes中的数据帧具有完全相同的结构