【问题标题】:Create multiple dataframes out of several dataframes multipling value according to "Base"-Dictionary根据“Base”-Dictionary 从多个数据帧乘以值创建多个数据帧
【发布时间】:2021-03-15 08:24:20
【问题描述】:

我有一个数据帧字典dataframes,它是基于时间的配置文件,每个时间点的值xy。下图是字典和该字典的一个数据框

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

Date Time value x value y
01.01.2018 0:00 0.45 0.11
01.01.2018 0:15 0.42 0.20

对于那些我想创建新数据框字典的人; dataframes2,其中值xy 是旧数据帧乘以一个值的总和。 该值包含在另一个嵌套字典中:

base_dict={'area1':{'SG1':0.0,'SG2':1.0}, 'area2':{'SG1':1.0,'SG2':0.0}}

(注意:我把字典写短了)

最后dataframes2 应该是这样的:

dataframes2={'area1':Dataframe, 'area2':Dataframe} 虽然 area1 看起来像这样:

Date Time value x value y
01.01.2018 0:00 0.0 * SG1 value x+1.0* SG2 value x 0.0 * SG1 value y+1.0 * SG2 value y
01.01.2018 0:15 0.0 * SG1 value x+ 1.0 * SG2 value x 0.0 * SG1 value y+1.0 * SG2 value y

我想使用多个 for 循环,但我不确定从哪里开始。 你能帮帮我吗?

【问题讨论】:

  • 面积变量从何而来?

标签: python pandas dictionary


【解决方案1】:

如果您的所有数据帧都具有相同的日期和时间,您可以在一个 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

如果时间戳不同,您可以采用类似的方法,但您需要进行合并,而不是仅仅创建一个新的数据框。

编辑:我们在 cmets 中进行了讨论,但由于我无法在此处发布代码示例,因此这是我的代码的完整最小示例,它不返回 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}

【讨论】:

  • 应用这个我得到错误:TypeError: 'dict_keys' object does not support indexing
  • 是的,我的错,您需要先将df_keys 转换为列表。我已经编辑了我原来的答案。
  • 您使用的索引 1 和 2,例如。如果数据框的大小为 (96,4) ,您将如何更改? (对不起,如果这是一个愚蠢的问题)
  • 索引用于字典中的键,而不是数据框中的键。尝试运行循环并打印df_keys 的值以了解。
  • 另外,如果我的回答有帮助,请考虑点赞或接受。
【解决方案2】:

事实上,这里甚至可以使用推导式。诀窍是您可以对完整数据帧使用操作,前提是它们具有相同的索引和列。因此,如果您隐藏索引中的 DateTime 列,一切正常:

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()}

【讨论】:

  • 这看起来是一个非常简洁的解决方案。但是,日期和时间需要单独存储在数据框中,因为这种形式对于导入另一个软件很重要。无论如何可以使用对象类型作为索引吗? (时间和日期存储为对象。即使这样不好,也是有原因的)谢谢!
  • 我的代码包含一个reset_index,因为这个原因:日期和时间在操作后变成了普通列,来自dataframe2的数据帧与dataframes中的数据帧具有完全相同的结构
【解决方案3】:

注意:这是基于 Darina 的回答。因为这似乎很容易把它放在 cmets 中,所以我把它写成一个不同的答案。我更改了代码,因为 Darina 的回答创建了一个系列对象,并且数据框的大小为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多