python Pandas : transforming - moving values from diagonal

标签 python matrix pandas

给定以下 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   

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

最佳答案

但是您在此过程中正在更改数据,对吗?

我不知道 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 看起来总是像这里显示的那样,它就像一个内部没有 0 的上对角矩阵,您可以走捷径:

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] 

关于 python Pandas : transforming - moving values from diagonal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044492/

相关文章:

python - SQLAlchemy-Migrate 或 Alembic 重命名模型时删除数据

matlab - filter2函数中滤波器矩阵旋转的物理意义

c++ - vector 持有只读矩阵?

python - 相关矩阵图,一侧是系数,另一侧是散点图,对角线分布

python - 从只有网站 url 的元标记和 img url 中提取值。为 django 应用程序用 python 编写

python - Django:从数据库显示的 DecimalField 格式值

c++ - 使用 GSL 进行 QR 分解的零空间基

python - 在 pandas 中组合具有重叠索引的不同列

python - 使用 pandas 有条件地连接 python 中的数据框

python - 在 PostgreSQL 数据库上使用 syncdb --migrate 失败。循环依赖