【问题标题】:Python Pandas: transforming - moving values from diagonalPython Pandas:转换 - 从对角线移动值
【发布时间】:2014-06-04 18:04:05
【问题描述】:

给定以下 DataFrame,分组为:

    dataset = z.groupby(
        ['app', 'regmonth', 'loginsmonth']).sum().unstack().fillna(
            0, inplace=False)


                             cnt                                      
loginsmonth           2014-02-01  2014-03-01  2014-04-01  2014-05-01   
app       regmonth                                                     
1         2014-02-01        6069        1837         107          54   
          2014-03-01           0       10742        2709        1394   
          2014-04-01           0           0        5584        1107   
          2014-05-01           0           0           0        3044   
          2014-06-01           0           0           0           0   

我想把它改成:

                             cnt                                      
loginsmonth           2014-02-01  2014-03-01  2014-04-01  2014-05-01   
app       regmonth                                                     
1         2014-02-01        6069        1837         107          54   
          2014-03-01       10742        2709        1394           0   
          2014-04-01        5584        1107           0           0   
          2014-05-01        3044           0           0           0
          2014-06-01           0           0           0           0   

因此,它将对角线移动到行的开头并用零填充空白。 熊猫有什么简单的方法吗?

【问题讨论】:

  • 我认为有一个关于这个的 github 问题(以及这里以前的一些问题)...... IIRC DSM 有一个很好的解决方案。
  • @AndyHayden 链接未呈现 :)
  • @Jeff 我不记得找到这些链接的关键字了! :(我很漂亮确定我不是在编造这个......

标签: python matrix pandas


【解决方案1】:

但是你在这个过程中改变了你的数据,对吧?

我不知道pandas 是否有一个不错的方法,但np.diagnoal 可以在这里做你想做的事:

In [96]:

print df
loginsmonth     2014-02-01  2014-03-01  2014-04-01  2014-05-01
app regmonth                                                  
1   2014-02-01        6069        1837         107          54
    2014-03-01           0       10742        2709        1394
    2014-04-01           0           0        5584        1107
    2014-05-01           0           0           0        3044
    2014-06-01           0           0           0           0

[5 rows x 4 columns]
In [124]:

print df*0+np.asarray([np.hstack((np.diagonal(df.values, i), np.zeros(i+1, int))) 
                       for i in range(df.shape[1])]).T
loginsmonth     2014-02-01  2014-03-01  2014-04-01  2014-05-01
app regmonth                                                  
1   2014-02-01        6069        1837         107          54
    2014-03-01       10742        2709        1394           0
    2014-04-01        5584        1107           0           0
    2014-05-01        3044           0           0           0
    2014-06-01           0           0           0           0

[5 rows x 4 columns]

这里np.zeros(i+1, int) 中的1df.shape[0]-df.shape[1]。不知道你会不会有df.shape[0]df.shape[1]的情况。

但如果你的DataFrame 总是像这里显示的那样,就像一个没有0s 内部的上对角矩阵,你可以走捷径:

In [134]:

print df.apply(lambda x: sorted(x, key=lambda y: y==0), axis=1)
cnt             2014-02-01  2014-03-01  2014-04-01  2014-05-01
app regmonth                                                  
1   2014-02-01        6069        1837         107          54
    2014-03-01       10742        2709        1394           0
    2014-04-01        5584        1107           0           0
    2014-05-01        3044           0           0           0
    2014-06-01           0           0           0           0

[5 rows x 4 columns] 

【讨论】:

  • 如果某个对角线元素是 NaN,则两种解决方案都不适用于该行。除此之外,这两种解决方案都能完美运行。
  • @jbastos,我认为不应该有nans,因为你已经有.fillna(0)
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多