【问题标题】:Iterate through multiple dataframes and perform calculation based on specific column遍历多个数据框并根据特定列执行计算
【发布时间】:2018-06-01 00:28:54
【问题描述】:

我有几个以月份为列的数据框,并且包含整数值。我为此示例发布了 2。

df1 =     
             June 2016       July 2016
Flavor
Vanilla      17.0            23.0
Chocolate    7.0             12.0
Strawberry   11.0            14.0

df2 =        
             June 2016       July 2016
Flavor
Vanilla      9.0            19.0
Chocolate    10.0           3.0

当必须匹配时,如何遍历每个数据框并根据数据框的行名和列名执行计算?例如,我想计算 Vanilla 7 月份的平均值,即 (23 + 19)/2。如果数据框中也不存在Flavor,那么我还想在该数据框中每月分配一个常量值(在本例中为 15)。我是否将数据框附加在一起然后应用.mean()

提前致谢,对任何突然的情况深表歉意,我目前正在旅途中,正在旅行。

谢谢!

【问题讨论】:

  • 啊,又是宽数据集!我们又见面了。

标签: python pandas dataframe average


【解决方案1】:

groupby 与列一起使用

pd.concat([df1,df2],1).fillna(15).groupby(level=0,axis=1).mean()
Out[408]: 
            July2016  June2016
Chocolate        7.5       8.5
Strawberry      14.5      13.0
Vanilla         21.0      13.0

【讨论】:

  • 不错!这比我的好多了!
【解决方案2】:

考虑直接向量化,因为您可以跨相似的结构化数据帧运行算术运算:

(df1 + df2.reindex(labels=df1.index.values, fill_value=15)) / 2

#             June 2016  July 2016
# Flavor                          
# Vanilla          13.0       21.0
# Chocolate         8.5        7.5
# Strawberry       13.0       14.5

对于列表中的许多数据框,请考虑reduce

from functools import reduce

df_list = [df1, df2]
new_df_list = [d.reindex(labels=df1.index.values, fill_value=15) for d in df_list]

reduce(lambda x,y: x + y, new_df_list) / len(new_df_list)

#             June 2016  July 2016
# Flavor                          
# Vanilla          13.0       21.0
# Chocolate         8.5        7.5
# Strawberry       13.0       14.5

数据

import pandas as pd
from io import StringIO

txt = '''             
Flavor      "June 2016"       "July 2016"
Vanilla      17.0            23.0
Chocolate    7.0             12.0
Strawberry   11.0            14.0'''

df1 = pd.read_table(StringIO(txt), sep="\s+", index_col=0)


txt = '''             
Flavor      "June 2016"       "July 2016"
Vanilla      9.0            19.0
Chocolate    10.0           3.0'''

df2 = pd.read_table(StringIO(txt), sep="\s+", index_col=0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多