【问题标题】:Counting Occurrences Across Dataframe Rows计算跨数据框行的出现次数
【发布时间】:2016-04-19 09:21:50
【问题描述】:

我找到了与此类似的回复,但没有什么能完全奏效。我有一个看起来像这样的数据表:

ID          DATE
74180       11/07/2000
74180       11/04/2008
81337       11/04/2008
81337       11/02/2010
82557       11/07/2000
82557       11/05/2002
82557       11/02/2004
82557       11/04/2008
82557       11/06/2012
82901       11/07/2000
82901       11/05/2002
82901       11/02/2004
82901       11/04/2008
82901       11/06/2012
82901       11/04/2014
83103       11/04/2008
83103       11/02/2010
83103       11/06/2012
83103       11/04/2014

我想对此进行转换,以便每个 ID 占据一行,并将各种日期表示为二进制列,即:

ID        11/07/2000   11/05/2002   11/02/2004 ...
74180     1              0           0 
81337     0              0           0

任何指导将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先,重新创建您的 DataFrame:

    ID = [74180,74180,81337,81337,82557,82557,82557,82557,82557,82901,82901,82901,82901,82901,82901,83103,83103,83103,83103]
    DATE = ['2000-11-07','2008-11-04','2008-11-04','2010-11-02','2000-11-07','2002-11-05','2004-11-02','2008-11-04','2012-11-06','2000-11-7','2002-11-05','2004-11-02','2008-11-04','2012-11-06','2014-11-04','2008-11-04','2010-11-02','2012-11-06','2014-11-04']
    df = pd.DataFrame({'ID':ID, 'DATE':DATE})
    

    实际加工:

    df2 = pd.get_dummies(df.set_index('ID')['DATE'])
    df2.reset_index().groupby('ID').sum()
    

    输出:

           2000-11-07  2000-11-7  2002-11-05  2004-11-02  2008-11-04 ...
    ID
    74180         1.0        0.0         0.0         0.0         1.0 ...
    81337         0.0        0.0         0.0         0.0         1.0 ...
    82557         1.0        0.0         1.0         1.0         1.0 ...
    82901         0.0        1.0         1.0         1.0         1.0 ...
    83103         0.0        0.0         0.0         0.0         1.0 ...
    

    【讨论】:

    • 这当然看起来很接近,但由于某种原因,我的代码正在产生预期的结果。我仍然为每个“ID”保留多行。 df2 = pd.get_dummies(df2.set_index('ID')['DATE']) df2.reset_index().groupby('ID').sum() 我没发现错误?
    【解决方案2】:

    考虑:

    df.set_index('ID', inplace=True)
    pd.get_dummies(df.loc[:, 'DATE']).groupby(level='ID').sum()
    
           2000-11-07  2002-11-05  2004-11-02  2008-11-04  2010-11-02  2012-11-06  \
    ID                                                                              
    74180         1.0         0.0         0.0         1.0         0.0         0.0   
    81337         0.0         0.0         0.0         1.0         1.0         0.0   
    82557         1.0         1.0         1.0         1.0         0.0         1.0   
    82901         1.0         1.0         1.0         1.0         0.0         1.0   
    83103         0.0         0.0         0.0         1.0         1.0         1.0   
    
           2014-11-04  
    ID                 
    74180         0.0  
    81337         0.0  
    82557         0.0  
    82901         1.0  
    83103         1.0
    

    【讨论】:

    • 可爱,这解决了第一个问题。现在我需要根据 ID 将它们折叠成一行。
    猜你喜欢
    • 1970-01-01
    • 2021-01-06
    • 2021-08-02
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多