【问题标题】:Use Pandas dataframe to add lag feature from MultiIindex Series使用 Pandas 数据框从 MultiIndex 系列中添加滞后功能
【发布时间】:2016-12-05 07:37:42
【问题描述】:

我有一个 MultiIndex 系列(3 个索引),如下所示:

Week   ID_1    ID_2
3       26     1182            39.0
               4767            42.0
               31393           20.0
               31690           42.0
               32962            3.0
....................................

我还有一个数据框df,其中包含上述系列中用于索引的所有列(以及更多列),我想在我的数据框df 中创建一个新列,其中包含与@987654324 匹配的值@ 和 ID_2 以及系列中的 Week - 2

例如,对于具有ID_1 = 26ID_2 = 1182Week = 3 的数据框中的行,我想匹配由ID_1 = 26ID_2 = 1182Week = 1 索引的系列中的值(3- 2) 并将其放在该行的新列中。此外,我的 Series 可能不一定具有数据框所需的值,在这种情况下,我希望只有 0。

现在,我正在尝试使用:

[multiindex_series.get((x[1].get('week', 2) - 2, x[1].get('ID_1', 0), x[1].get('ID_2', 0))) for x in df.iterrows()]

但是,这非常慢并且内存占用很大,我想知道有什么更好的方法来做到这一点。

FWIW,系列是使用

创建的
saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median()

如果存在更好的路径来创建我正在寻找的东西,我愿意以不同的方式来做。

【问题讨论】:

    标签: python pandas dataframe data-science


    【解决方案1】:

    Week 增加 2:

    saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median()
    saved_groupby = saved_groupby.reset_index()
    saved_groupby['Week'] = saved_groupby['Week'] + 2
    

    然后将dfsaved_groupby 合并:

    result = pd.merge(df, saved_groupby, on=['Week', 'ID_1', 'ID_2'], how='left')
    

    这将增加 df 与 2 周前的目标中值。 要使中位数(目标)saved_groupby 在没有匹配的情况下为 0 列,请使用 fillna 将 NaN 更改为 0:

    result['Median'] = result['Median'].fillna(0)
    

    例如,

    import numpy as np
    import pandas as pd
    np.random.seed(2016)
    
    df = pd.DataFrame(np.random.randint(5, size=(20,5)), 
                      columns=['Week', 'ID_1', 'ID_2', 'Target', 'Foo'])
    
    saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median()
    saved_groupby = saved_groupby.reset_index()
    saved_groupby['Week'] = saved_groupby['Week'] + 2
    saved_groupby = saved_groupby.rename(columns={'Target':'Median'})
    
    result = pd.merge(df, saved_groupby, on=['Week', 'ID_1', 'ID_2'], how='left')
    result['Median'] = result['Median'].fillna(0)
    print(result)
    

    产量

        Week  ID_1  ID_2  Target  Foo  Median
    0      3     2     3       4    2     0.0
    1      3     3     0       3    4     0.0
    2      4     3     0       1    2     0.0
    3      3     4     1       1    1     0.0
    4      2     4     2       0    3     2.0
    5      1     0     1       4    4     0.0
    6      2     3     4       0    0     0.0
    7      4     0     0       2    3     0.0
    8      3     4     3       2    2     0.0
    9      2     2     4       0    1     0.0
    10     2     0     4       4    2     0.0
    11     1     1     3       0    0     0.0
    12     0     1     0       2    0     0.0
    13     4     0     4       0    3     4.0
    14     1     2     1       3    1     0.0
    15     3     0     1       3    4     2.0
    16     0     4     2       2    4     0.0
    17     1     1     4       4    2     0.0
    18     4     1     0       3    0     0.0
    19     1     0     1       0    0     0.0
    

    【讨论】:

    • 太棒了,还没有考虑重置索引,谢谢!我认为为了解决我的问题,我应该 add 2 到一周,不是吗?否则,我相信数据框将包含未来几周的中位数目标。
    • 对,如果你想用 2 周前的中值目标来扩充原始 DataFrame,那么使用saved_groupby['Week'] = saved_groupby['Week'] + 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2021-06-14
    • 2015-09-05
    • 2019-11-27
    相关资源
    最近更新 更多