Python 多指标熊猫月气候学数据框架

Python 多指标熊猫月气候学数据框架,python,pandas,mean,multi-index,Python,Pandas,Mean,Multi Index,我有一个包含两年每月数据的数据框架Y。我需要第二列Y_avg和气候学,以便能够两者相减 Y Y_avg T X 2000-01-31 1 51 63 2 52 64 2000-02-29 1 53 65 2 54 66 2000-03-31 1 55 67 2 56 68 2000-04-30 1 57 69 2 58

我有一个包含两年每月数据的数据框架
Y
。我需要第二列
Y_avg
和气候学,以便能够两者相减

              Y   Y_avg
T          X    
2000-01-31 1  51  63
           2  52  64
2000-02-29 1  53  65
           2  54  66
2000-03-31 1  55  67
           2  56  68
2000-04-30 1  57  69
           2  58  70
2000-05-31 1  59  71
           2  60  72
2000-06-30 1  61  73
           2  62  74
2000-07-31 1  63  75
           2  64  76
2000-08-31 1  65  77
           2  66  78
2000-09-30 1  67  79
           2  68  80
2000-10-31 1  69  81
           2  70  82
2000-11-30 1  71  83
           2  72  84
2000-12-31 1  73  85
           2  74  86
2001-01-31 1  75  63
           2  76  64
2001-02-28 1  77  65
           2  78  66
2001-03-31 1  79  67
           2  80  68
2001-04-30 1  81  69
           2  82  70
2001-05-31 1  83  71
           2  84  72
2001-06-30 1  85  73
           2  86  74
2001-07-31 1  87  75
           2  88  76
2001-08-31 1  89  77
           2  90  78
2001-09-30 1  91  79
           2  92  80
2001-10-31 1  93  81
           2  94  82
2001-11-30 1  95  83
           2  96  84
2001-12-31 1  97  85
           2  98  86
这是我的临时解决方案:

f = np.tile(np.arange(1,25),2)
df['Y_avg'] = np.tile(df.groupby(f).mean().values.ravel(),2)
但我如何才能更有效地做到这一点?
谢谢你的帮助

所以你希望Y_平均值是X和T月的平均值,对吗?假设多重索引的T级别是DatetimeIndex,请使用

gb = df['Y'].groupby([df.index.get_level_values(0).month,
                      pd.Grouper(level=1)])
df['Y_avg'] = gb.transform('mean')

首先,我在粘贴数据时很难重新创建数据帧副本,所以 对于所有想回答此问题的人,可以使用以下代码重新创建示例:

import pandas as pd

# Create a date range, convert to list and duplicate
T = pd.date_range("2000-01-31", "2001-12-31", freq="M").tolist() * 2
# Create a list of repeated [1, 2] to match length of T
X = [1, 2] * (len(T) // 2)
Y = range(51, 99)
index = pd.MultiIndex.from_arrays([sorted(T), X], names=("T", "X"))
df = pd.DataFrame({"Y": Y}, index=index)
Y_avg = df.Y.mean(level="T")
df = df.join(Y_avg, on="T", rsuffix="_avg")
然后,要计算关于T级的Y平均值,可以使用以下代码:

import pandas as pd

# Create a date range, convert to list and duplicate
T = pd.date_range("2000-01-31", "2001-12-31", freq="M").tolist() * 2
# Create a list of repeated [1, 2] to match length of T
X = [1, 2] * (len(T) // 2)
Y = range(51, 99)
index = pd.MultiIndex.from_arrays([sorted(T), X], names=("T", "X"))
df = pd.DataFrame({"Y": Y}, index=index)
Y_avg = df.Y.mean(level="T")
df = df.join(Y_avg, on="T", rsuffix="_avg")

首先,您可以使用的level参数计算特定指数的平均值。您可以执行标准,将Y_avg系列与“T”索引上的数据帧合并。请注意,您必须提供一个后缀(在本例中为rsuffix)来正确处理列的名称。

为什么选择向下投票?答案很好,除非我误解了问题。@jaime ac你能标记为已回答,或者给我一个投票吗?