将数据框对角线对齐到列中?
Align dataframe diagonals into columns?
考虑 pd.DataFrame
df
df = pd.DataFrame([
[1, 2, 3, 4, 5],
[5, 1, 2, 3, 4],
[4, 5, 1, 2, 3],
[3, 4, 5, 1, 2],
[2, 3, 4, 5, 1]
], list('abcde'), list('ABCDE'))
如何将对角线值对齐到列中?
我想要这样的结果
我已经做到了
pd.DataFrame([np.roll(row, -k) for k, (_, row) in enumerate(df.iterrows())],
df.index, df.columns)
我希望有更直接的东西。
您可以使用 numpy solution - 因为 shift 被反向使用 Series
与 DataFrame
相同的长度(如果 DataFrame
具有非数字和非单调索引,它工作得很好还有):
A = df.values
r = pd.Series(range(len(df)))[::-1] + 1
rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]]
r[r < 0] += A.shape[1]
column_indices = column_indices - r[:,np.newaxis]
result = A[rows, column_indices]
print (pd.DataFrame(result, df.index, df.columns))
A B C D E
a 1 2 3 4 5
b 1 2 3 4 5
c 1 2 3 4 5
d 1 2 3 4 5
e 1 2 3 4 5
这是另一种使用 NumPy broadcasting
-
的方法
a = df.values
n = a.shape[1]
r = np.arange(n)
col = np.mod(r[:,None] + r,n)
df_out = pd.DataFrame(a[np.arange(n)[:,None],col],columns=df.columns)
考虑 pd.DataFrame
df
df = pd.DataFrame([
[1, 2, 3, 4, 5],
[5, 1, 2, 3, 4],
[4, 5, 1, 2, 3],
[3, 4, 5, 1, 2],
[2, 3, 4, 5, 1]
], list('abcde'), list('ABCDE'))
如何将对角线值对齐到列中?
我想要这样的结果
我已经做到了
pd.DataFrame([np.roll(row, -k) for k, (_, row) in enumerate(df.iterrows())],
df.index, df.columns)
我希望有更直接的东西。
您可以使用 numpy solution - 因为 shift 被反向使用 Series
与 DataFrame
相同的长度(如果 DataFrame
具有非数字和非单调索引,它工作得很好还有):
A = df.values
r = pd.Series(range(len(df)))[::-1] + 1
rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]]
r[r < 0] += A.shape[1]
column_indices = column_indices - r[:,np.newaxis]
result = A[rows, column_indices]
print (pd.DataFrame(result, df.index, df.columns))
A B C D E
a 1 2 3 4 5
b 1 2 3 4 5
c 1 2 3 4 5
d 1 2 3 4 5
e 1 2 3 4 5
这是另一种使用 NumPy broadcasting
-
a = df.values
n = a.shape[1]
r = np.arange(n)
col = np.mod(r[:,None] + r,n)
df_out = pd.DataFrame(a[np.arange(n)[:,None],col],columns=df.columns)