我有一个DataFrame,其中包含两年的每月数据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)
但是我如何才能更有效地做到这一点? 感谢您的帮助!
答案 0 :(得分:0)
首先,我很难重新创建复制粘贴数据的数据框,所以 对于可能想要回答这个问题的所有人,您可以使用以下代码重新创建示例:
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)
然后根据水平T计算Y的平均值,您可以使用以下代码:
Y_avg = df.Y.mean(level="T")
df = df.join(Y_avg, on="T", rsuffix="_avg")
首先,您可以使用mean series method的level参数来计算相对于特定索引的均值。您可以执行标准的dataframe join以将Y_avg系列与“ T”索引上的数据帧合并。请注意,您必须提供一个后缀(在本例中为后缀)以正确处理列的名称。
答案 1 :(得分:-1)
所以您希望Y_avg是X和T月份的平均值,对吗?假设您的MultiIndex的T级别是DatetimeIndex,请使用
gb = df['Y'].groupby([df.index.get_level_values(0).month,
pd.Grouper(level=1)])
df['Y_avg'] = gb.transform('mean')