我碰巧有一個如下所示的資料集:
A-B A-B A-B A-B A-B B-A B-A B-A B-A B-A
2 3 2 4 5 3.1 3 2 2.5 2.6
NaN 3.2 3.3 3.5 5.2 NaN 4 2.7 3.2 5
NaN NaN 4.1 4 6 NaN NaN 4 4.1 6
NaN NaN NaN 4.2 5.1 NaN NaN NaN 3.5 5.2
NaN NaN NaN NaN 6 NaN NaN NaN NaN 5.7
這很糟糕,我知道。但我想獲得的是:
A-B B-A
2 3.1
3.2 4
4.1 4
4.2 3.5
6 5.7
哪些是“對角線”上的值
有沒有辦法讓我得到這樣的東西?
uj5u.com熱心網友回復:
您可以使用groupby和字典理解numpy.diag:
df2 = pd.DataFrame({x: np.diag(g) for x, g in df.groupby(level=0, axis=1)})
輸出:
A-B B-A
0 2.0 3.1
1 3.2 4.0
2 4.1 4.0
3 4.2 3.5
4 6.0 5.7
uj5u.com熱心網友回復:
另一種選擇是轉換為長格式,然后洗掉重復項:這可以通過pivot_longerfrom實作pyjanitor:
# pip install pyjanitor
import pandas as pd
import janitor
(
df
.pivot_longer(names_to=".value",
names_pattern=r"(. )",
ignore_index=False)
.dropna()
.loc[lambda df: ~df.index.duplicated()]
)
A-B B-A
0 2.0 3.1
1 3.2 4.0
2 4.1 4.0
3 4.2 3.5
4 6.0 5.7
@mozway 的解決方案應該更快,因為您避免構建大量行只是為了修剪它們,這就是此選項的作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/433564.html
