所以我知道有很多關于如何將一列元組拆分為幾列的帖子。但是我還沒有看到任何關于如何同時拆分幾列元組的資訊。我試過做一個嵌套應用:
spl.apply(lambda col: spl[col].apply(pd.Series))
但它不起作用。
spl = pd.DataFrame({('a', 'b') : [(i, i 1) for i in range(3)],
('a', 'c'): [(2*i, 2*i 1) for i in range(3)],
('e', 'b'): [(2*i, 2*i 1) for i in range(3)]})
>>> spl
a e
b c b
0 (0, 1) (0, 1) (0, 1)
1 (1, 2) (2, 3) (2, 3)
2 (2, 3) (4, 5) (4, 5)
目標是:
a e
b0 b1 c0 c1 b0 b1
0 0 1 0 1 0 1
1 1 2 2 3 2 3
2 2 3 4 5 4 5
uj5u.com熱心網友回復:
這是一個解決方案:
new_df = pd.concat([pd.DataFrame(spl[c].tolist()).add_prefix(c[-1]) for c in spl], axis=1)
new_df.columns = pd.MultiIndex.from_arrays([np.repeat(spl.columns.get_level_values(0), 2), new_df.columns])
輸出:
>>> new_df
a e
b0 b1 c0 c1 b0 b1
0 0 1 0 1 0 1
1 1 2 2 3 2 3
2 2 3 4 5 4 5
一個大班輪:)
new_df = pd.concat([pd.DataFrame(spl[c].tolist()).add_prefix(c[-1]) for c in spl], axis=1).pipe(lambda x: x.set_axis(pd.MultiIndex.from_arrays([np.repeat(spl.columns.get_level_values(0), 2), x.columns]), axis=1))
uj5u.com熱心網友回復:
我們可以使用unstack DataFrame 建構式 pivot。我們不能旋轉一個 Series 物件,所以我們reset_index首先。
要修復重復的列名,我們可以通過將原始列名級別 1 與元組索引組合來創建 MultiIndex 物件來重新格式化列名:
tmp = spl.unstack()
out = (pd.pivot(pd.DataFrame(tmp.tolist(), index=tmp.index).reset_index(),
['level_2'], ['level_0','level_1'], [0,1])
.rename_axis(columns=[None, None, None], index=[None]))
out.columns = pd.MultiIndex.from_arrays((out.columns.get_level_values(1),
out.columns.get_level_values(2)
out.columns.get_level_values(0).astype(str)))
out = out.sort_index(axis=1)
輸出:
a e
b0 b1 c0 c1 b0 b1
0 0 1 0 1 0 1
1 1 2 2 3 2 3
2 2 3 4 5 4 5
正如@sammywemmy 在對這個問題的評論中所建議的那樣,從 vanilla Python 重建 DataFrame 確實比上面的混亂更容易。
from itertools import chain, product
out = pd.DataFrame([list(chain.from_iterable(lst)) for lst in spl.to_numpy().tolist()],
columns=pd.MultiIndex.from_tuples((i, j str(k)) for (i,j), k in
product(spl.columns, [0,1])))
uj5u.com熱心網友回復:
一種選擇是將其轉儲到 vanilla python 中,在重建 DataFrame 之前利用 python 的結構;根據您的資料大小,它可能更有效(并且希望更容易理解,如果您需要參考它) - 當然測驗是您驗證性能的真正方法(感謝@wjandrea 的改進):
frame = {}
for (top, bottom), value in spl.items():
for i, arr in enumerate(zip(*value)):
frame[(top, f"{bottom}{i}")] = arr
pd.DataFrame(frame)
a e
b0 b1 c0 c1 b0 b1
0 0 1 0 1 0 1
1 1 2 2 3 2 3
2 2 3 4 5 4 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441244.html
