获得正方形DataFrame
的对角线的有效方法是什么。我希望结果是Series
,MultiIndex
有两个级别,第一个是DataFrame
的索引,第二个级别是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
答案 0 :(得分:25)
如果您不介意使用numpy,可以使用numpy.diag
pd.Series(np.diag(df), index=[df.index, df.columns])
A a 2
B b 2
C c 3
dtype: int64
答案 1 :(得分:7)
你可以这样做:
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
但是johnchase's answer更整洁
答案 2 :(得分:3)
您还可以在列表推导中使用iat
来获得对角线。
>>> pd.Series([df.iat[n, n] for n in range(len(df))], index=[df.index, df.columns])
A a 2
B b 2
C c 3
dtype: int64