我正在嘗試找到一種從成對行的元組構建多索引資料幀的好方法。這是對的示例。
MultiIndex([(0, 4),
(1, 4),
(2, 4),
(3, 1),
(3, 2),
(4, 0),
(4, 3)],
)
這個問題適用于任何具有多行的資料框,但如果它有助于可視化這里的示例資料框
a b c d e
0 0.335356 0.496102 0.961942 0.624446 0.513594
1 0.775582 0.000616 0.255642 0.209872 0.605989
2 0.379600 0.847778 0.840465 0.321873 0.430256
3 0.221040 0.004871 0.392034 0.474216 0.334206
4 0.064554 0.148257 0.227480 0.083865 0.614093
例如,使用上述對和資料幀,構建單個多索引幀,其中第一級是第一對,第二級是與第一級配對的資料幀的所有行。
0 1 2 3 4
0 4 0.064554 0.148257 0.227480 0.083865 0.614093
1 4 0.064554 0.148257 0.227480 0.083865 0.614093
2 4 0.064554 0.148257 0.227480 0.083865 0.614093
3 1 0.775582 0.000616 0.255642 0.209872 0.605989
2 0.379600 0.847778 0.840465 0.321873 0.430256
4 0 0.335356 0.496102 0.961942 0.624446 0.513594
3 0.221040 0.004871 0.392034 0.474216 0.334206
我能想到的最好方法是構建一堆多索引子幀并進行連接,但對于本質上是原始資料幀的新視圖的內容來說似乎太笨重了。
multi_df = pd.DataFrame()
for lvl_0 in pairs.get_level_values(0).unique():
lvl_1 = pairs.get_level_values(1)[pairs.get_loc(lvl_0)]
local_df = pd.DataFrame(data=df.loc[lvl_1].values, index=pd.MultiIndex.from_product([[lvl_0], lvl_1]))
multi_df = pd.concat((multi_df, local_df), axis=0, join='outer')
順便說一句,即使在我的真實世界情況下這個隨機玩具示例中有重復的行,1 級索引彼此之間幾乎沒有重復,我并不擔心浪費資源。無論如何,我主要想使用這個新構建的多索引框架進行可視化/操作,而不是用于嚴重的數字運算。
編輯:如果有幫助,這里有一些用于測驗的構建器功能。
import pandas as pd
import random
def build_random_df(seed_val=242, nrows=5, ncols=5):
random.seed(seed_val)
columns = [chr(i) for i in range(97, 97 ncols)]
data = [[random.random() for j in range(ncols)] for i in range(nrows)]
df = pd.DataFrame(data=data, columns=columns)
return df
def build_random_pairs(seed_val=314, nrows=5):
random.seed(seed_val)
row_idx = list(range(nrows))
fake_matches = []
for j in range(nrows):
random.shuffle(row_idx)
pick_n = random.randint(2, nrows) // 2
fake_matches.extend(sorted([(j, i) for i in row_idx[:pick_n] if i!=j], key=lambda x: x[1]))
pairs = pd.MultiIndex.from_tuples(fake_matches)
return pairs
df = build_random_df()
pairs = build_random_pairs()
uj5u.com熱心網友回復:
不確定這是否是您的想法:
選擇最后一層的資料幀,并將第一層附加到最終資料幀:
index = pd.MultiIndex.from_tuples([(0, 4),
(1, 4),
(2, 4),
(3, 1),
(3, 2),
(4, 0),
(4, 3)],
)
a = index.get_level_values(0)
b = index.get_level_values(-1)
(df.loc[b]
.set_index(a, append = True)
.swaplevel()
.set_axis(range(df.columns.size), axis='columns')
)
0 1 2 3 4
0 4 0.064554 0.148257 0.227480 0.083865 0.614093
1 4 0.064554 0.148257 0.227480 0.083865 0.614093
2 4 0.064554 0.148257 0.227480 0.083865 0.614093
3 1 0.775582 0.000616 0.255642 0.209872 0.605989
2 0.379600 0.847778 0.840465 0.321873 0.430256
4 0 0.335356 0.496102 0.961942 0.624446 0.513594
3 0.221040 0.004871 0.392034 0.474216 0.334206
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/360296.html
