pandas DataFrame 对角线

新手上路,请多包涵

什么是获得正方形对角线的有效方法 DataFrame 。我希望结果是一个 Series 和一个 MultiIndex 有两个级别,第一个是 DataFrame 的索引,第二个是 levelca- 列 DataFrame

设置

import pandas as pd
import numpy as np

np.random.seed([3, 1415])
df = pd.DataFrame(np.random.rand(3, 3) * 5,
                  columns = list('abc'),
                  index = list('ABC'),
                  dtype=np.int64
                 )

我想看到这个:

 print df.stack().loc[[('A', 'a'), ('B', 'b'), ('C', 'c')]]

A  a    2
B  b    2
C  c    3

原文由 piRSquared 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 847
2 个回答

如果你不介意使用 numpy,你可以使用 numpy.diag

 pd.Series(np.diag(df), index=[df.index, df.columns])

A  a    2
B  b    2
C  c    3
dtype: int64

原文由 johnchase 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以这样做:

 In [16]:
midx = pd.MultiIndex.from_tuples(list(zip(df.index,df.columns)))
pd.DataFrame(data=np.diag(df), index=midx)

Out[16]:
     0
A a  2
B b  2
C c  3

np.diag 将为您提供作为 np 数组的对角线值,然后您可以通过压缩索引和列来构造多索引,并将其作为所需的索引传递给 DataFrame ctor。

其实复杂的多索引生成并不需要这么复杂:

 In [18]:
pd.DataFrame(np.diag(df), index=[df.index, df.columns])

Out[18]:
     0
A a  2
B b  2
C c  3

但是 约翰切斯的回答 更简洁

原文由 EdChum 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题