将多年平均列添加到每一行

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

以上是关于将多年平均列添加到每一行的主要内容,如果未能解决你的问题,请参考以下文章

Notepad++ 添加到每一行

如何返回游标以及添加到每一行的新变量?

TSQL:有没有办法限制返回的行并计算在没有限制的情况下返回的总数(不将其添加到每一行)?

将移动平均列添加到每个索引类别变量的数据框

Linux:将字数添加到文件的每一行

如何将列添加到依赖于数据帧或外部数据帧中组的平均值的数据帧?