将多年平均列添加到每一行
Posted
技术标签:
【中文标题】将多年平均列添加到每一行【英文标题】:Add multi year average column to each row 【发布时间】:2014-08-31 04:49:39 【问题描述】:我有一个每小时温度、降水量和其他数字字段的数据集,这些字段按 10 年前的时间戳索引。
我想为每个字段添加一个 10 年“平均”列。
我能够按月、日分组,从而获得每天的相应方法,但我不知道如何将这些方法添加回原始数据框。
这是我的代码:
http://cl.ly/WWRn
http://cl.ly/WWJW
有什么建议吗?
编辑:
如果您不转换为 t.date,则以下答案是正确的:
df['datetime'].apply(lambda t: "%d-%d" % (t.month, t.day) )
【问题讨论】:
那么您是否希望具有相同数据(年、月、日)的行具有相同的值?如果分组数据中有年、月、日,也许你可以merge()
(如 SQL 中的 join
)两个数据框。
是的......这正是我想要的......让我试试
问题在于分组数据帧没有相同数量的索引......每天只有一行......而原始数据帧每小时都有一行。 ...
merge()
可以像 SQL 一样执行left join
,并且应该从数据框中的行中复制组中的数据。
所以我认为这很接近,但问题是它们不共享相同的索引...第一个 df 由每小时时间戳索引,而分组的索引是我相信多索引.. . (第一个月然后是 31 天,第二个月然后是 31 天等)见这里cl.ly/WVqZ
【参考方案1】:
我做了这样的东西 - 也许它对你有帮助(或没有)。
import pandas as pd
df = pd.DataFrame( [
['2011-01-01 01:00', 1, 2, 3],
['2011-01-01 02:00', 10, 20, 30],
['2011-01-01 03:00', 100, 200, 300],
['2011-01-02 01:00', 4, 5, 6],
['2011-01-02 02:00', 40, 50, 60],
['2011-01-02 03:00', 400, 500, 600],
], columns=['datetime','a','b','c'])
# convert string datetime to object datetime
df['datetime'] = pd.to_datetime(df['datetime'])
# now I have example dataframe for work
# create row with date only
df['date'] = df['datetime'].apply(lambda t: t.date())
# groupe by date
g = df.groupby('date').mean()
# change `date` from index to normal column
g2 = g.reset_index()
# merge by `date` columns
new_df = pd.merge(left=df, right=g2, on='date', suffixes=('_df','_group') )
print df
print g
print g2
print new_df
df:
datetime a b c date
0 2011-01-01 01:00:00 1 2 3 2011-01-01
1 2011-01-01 02:00:00 10 20 30 2011-01-01
2 2011-01-01 03:00:00 100 200 300 2011-01-01
3 2011-01-02 01:00:00 4 5 6 2011-01-02
4 2011-01-02 02:00:00 40 50 60 2011-01-02
5 2011-01-02 03:00:00 400 500 600 2011-01-02
g:
a b c
date
2011-01-01 37 74 111
2011-01-02 148 185 222
g2:
date a b c
0 2011-01-01 37 74 111
1 2011-01-02 148 185 222
new_df:
datetime a_df b_df c_df date a_group b_group c_group
0 2011-01-01 01:00:00 1 2 3 2011-01-01 37 74 111
1 2011-01-01 02:00:00 10 20 30 2011-01-01 37 74 111
2 2011-01-01 03:00:00 100 200 300 2011-01-01 37 74 111
3 2011-01-02 01:00:00 4 5 6 2011-01-02 148 185 222
4 2011-01-02 02:00:00 40 50 60 2011-01-02 148 185 222
5 2011-01-02 03:00:00 400 500 600 2011-01-02 148 185 222
编辑:
使用left_on='date', right_index=True
就不需要使用reset_index()
# change `date` from index to normal column
#g2 = g.reset_index()
# merge by `date` columns
#new_df = pd.merge(left=df, right=g2, on='date', suffixes=('_df','_group') )
new_df = pd.merge(left=df, right=g2, left_on='date', right_index=True, suffixes=('_df','_group') )
打印 df
【讨论】:
这与我想要做的非常接近,但它只需要每个独特日子的平均值......我需要将所有 10 年中一天的平均值添加到每一天相应的日子。例如,假设所有 10 年 6 月 23 日的平均温度为 50,那么我希望每年 6 月 23 日的平均温度为 50。不过感谢您的帮助:) 所以你必须改变df['date'] = df['datetime'].apply(lambda t: t.date())
才能得到只有日期和月份。
例如df['date'] = df['datetime'].apply(lambda t: "%d-%d" % (t.month, t.day) )
是的!那行得通! df['date'] = df['datetime'].apply(lambda t: "%d-%d" % (t.month, t.day) )以上是关于将多年平均列添加到每一行的主要内容,如果未能解决你的问题,请参考以下文章