【问题标题】:Pad a dataframe with pane data用窗格数据填充数据框
【发布时间】:2018-03-15 09:32:17
【问题描述】:

我有一个这样的数据框。

import pandas as pd
df = pd.DataFrame({'User':['A','A','A','A','B', 'B'], 
                   'Month':['2017-01-01','2017-03-01','2017-05-01','2017-09-01','2017-01-01','2017-05-01'],
                    'count':[2,2,2,2,5,5]})

我想填充数据,使其看起来像这样

df = pd.DataFrame({'User':['A','A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B','B'],
               'Month':['2017-01-01','2017-02-01','2017-03-01','2017-04-01','2017-05-01','2017-06-01','2017-07-01','2017-08-01','2017-09-01','2017-10-01','2017-11-01','2017-12-01','2017-01-01','2017-02-01','2017-03-01','2017-04-01','2017-05-01','2017-06-01','2017-07-01','2017-08-01','2017-09-01','2017-10-01','2017-11-01','2017-12-01'], 
               'count':[2,0,2,0,2,0,0,0,2,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0]})

【问题讨论】:

    标签: python python-3.x pandas indexing


    【解决方案1】:
    mux = pd.MultiIndex.from_product([
        df.User.unique(),
        pd.date_range('2017-01-01', periods=12, freq='MS')
    ], names=['User', 'Month'])
    
    df.set_index(['User', 'Month']).reindex(mux, fill_value=0) \
      .swaplevel(0, 1).reset_index()
    
            Month User  count
    0  2017-01-01    A      2
    1  2017-02-01    A      0
    2  2017-03-01    A      2
    3  2017-04-01    A      0
    4  2017-05-01    A      2
    5  2017-06-01    A      0
    6  2017-07-01    A      0
    7  2017-08-01    A      0
    8  2017-09-01    A      2
    9  2017-10-01    A      0
    10 2017-11-01    A      0
    11 2017-12-01    A      0
    12 2017-01-01    B      5
    13 2017-02-01    B      0
    14 2017-03-01    B      0
    15 2017-04-01    B      0
    16 2017-05-01    B      5
    17 2017-06-01    B      0
    18 2017-07-01    B      0
    19 2017-08-01    B      0
    20 2017-09-01    B      0
    21 2017-10-01    B      0
    22 2017-11-01    B      0
    23 2017-12-01    B      0
    

    【讨论】:

    • 非常接近!感谢您及时的回复。用户列必须是 A 和 B,不能为零。
    • 请随时更改您的答案,因为您没有在您的答案下显示我;)
    • 当然,我知道 ;)
    • swaplevel 可以切碎吗?我猜你是用它来排序的?
    • @Zero 我把它放在那里只是为了让列按正确的顺序排列。是的,它可以被摆脱。
    【解决方案2】:

    使用set_indexunstackreindex

    In [591]: tidx = pd.date_range('2017-01-01', periods=12, freq='MS')
    
    In [592]: (df.set_index(['Month', 'User'])['count'].unstack()
                 .reindex(tidx)
                 .fillna(0)
                 .unstack().reset_index()
                 .rename(columns={'level_1': 'Month', 0: 'count'}))
    Out[592]:
       User      Month  count
    0     A 2017-01-01    2.0
    1     A 2017-02-01    0.0
    2     A 2017-03-01    2.0
    3     A 2017-04-01    0.0
    4     A 2017-05-01    2.0
    5     A 2017-06-01    0.0
    6     A 2017-07-01    0.0
    7     A 2017-08-01    0.0
    8     A 2017-09-01    2.0
    9     A 2017-10-01    0.0
    10    A 2017-11-01    0.0
    11    A 2017-12-01    0.0
    12    B 2017-01-01    5.0
    13    B 2017-02-01    0.0
    14    B 2017-03-01    0.0
    15    B 2017-04-01    0.0
    16    B 2017-05-01    5.0
    17    B 2017-06-01    0.0
    18    B 2017-07-01    0.0
    19    B 2017-08-01    0.0
    20    B 2017-09-01    0.0
    21    B 2017-10-01    0.0
    22    B 2017-11-01    0.0
    23    B 2017-12-01    0.0
    

    【讨论】:

    • 这仍然会使较旧的 nan 无法取消堆栈,因此稍后再进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多