我有許多變數,我的目的是在多次迭代中填充每個變數,而每個變數都需要不同的運算式來提取它們的值。我正在嘗試做的大致相當于以下 for 回圈。
pairs = {('Ams', 'Rot') : 10, ('Del', 'Utr') : 12, ('Ams', 'Utr') : 14, ('Del', 'Rot') : 16}
var_1 = []
var_2 = []
var_3 = []
var_4 = []
for i in range(3):
for (j, k) in pairs:
var_1.append(i)
var_2.append(j)
var_3.append(k)
var_4.append(pairs[(j, k)])
df = {'Var_1' : var_1, 'Var_2' : var_2, 'Var_3' : var_3, 'Var_4' : var_4}
df = pd.DataFrame(df)
print(df)
我想要的輸出:
Var_1 Var_2 Var_3 Var_4
0 0 Ams Rot 10
1 0 Del Utr 12
2 0 Ams Utr 14
3 0 Del Rot 16
4 1 Ams Rot 10
5 1 Del Utr 12
6 1 Ams Utr 14
7 1 Del Rot 16
8 2 Ams Rot 10
9 2 Del Utr 12
10 2 Ams Utr 14
11 2 Del Rot 16
但是,我很想知道是否有更有效的方法來執行此操作,尤其是使用pandas. 最后,我想創建以下字典的 pandas DataFrame。
uj5u.com熱心網友回復:
您可以使用基于索引的解決方案:
當你有一個字典時,創建一個資料框,資料是值,索引是鍵。在您的情況下,您有元組鍵,因此使用索引將是pd.MultiIndex. 此時您有Var_2和。Var_3Var_4
棘手的部分是Var_1從這個資料框生成。重復索引 3 次并重新索引資料框。所有值都是重復的。所以你有 3 x (Ams, Rot, 10), 3 x (Del, Utr, 12) 等等。現在,如果您將這些重復的行組合在一起,您可以使用它cumcount來創建一個 ID(0 -> 第一個實體,1 -> 第二個實體,...)。最后按索引()對資料框進行排序Var_1并重置它以獲得預期的結果。
# Part 1: create Var_2, Var_3 and Var_4
mi = pd.MultiIndex.from_tuples(pairs.keys(), names=['Var_2', 'Var_3'])
df = pd.DataFrame({'Var_4': pairs.values()}, index=mi).reset_index()
# Part 2: create Var_1
df = df.reindex(df.index.repeat(3))
df = df.set_index(df.groupby(df.columns.tolist()).cumcount().rename('Var_1')) \
.sort_index().reset_index()
輸出:
>>> df
Var_1 Var_2 Var_3 Var_4
0 0 Ams Rot 10
1 0 Del Utr 12
2 0 Ams Utr 14
3 0 Del Rot 16
4 1 Ams Rot 10
5 1 Del Utr 12
6 1 Ams Utr 14
7 1 Del Rot 16
8 2 Ams Rot 10
9 2 Del Utr 12
10 2 Ams Utr 14
11 2 Del Rot 16
uj5u.com熱心網友回復:
你可以用dict-comprehension它來輕松設定
names = ['var_1', 'var_2', 'var_3', 'var_4']
values = {n: range(3) for n in names}
df = pd.DataFrame(values)
var_1 var_2 var_3 var_4
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
但是創建具有相同列的資料框有點奇怪,沒有太多資訊
uj5u.com熱心網友回復:
嘗試:
df = (pd.DataFrame({n: pd.Series(pairs) for n in range(3)})
.stack()
.rename_axis(["Var_2", "Var_3", "Var_1"])
.rename("Var_4")
.reset_index()
.sort_values("Var_1", ignore_index=True)
.sort_index(axis=1)
)
>>> df
Var_1 Var_2 Var_3 Var_4
0 0 Ams Rot 10
1 0 Del Utr 12
2 0 Ams Utr 14
3 0 Del Rot 16
4 1 Ams Rot 10
5 1 Del Utr 12
6 1 Ams Utr 14
7 1 Del Rot 16
8 2 Ams Rot 10
9 2 Del Utr 12
10 2 Ams Utr 14
11 2 Del Rot 16
uj5u.com熱心網友回復:
嘗試:
df = pd.concat([pd.Series(pairs, name='Var_4').to_frame()]*3, keys=range(3),
names=['Var_1', 'Var_2', 'Var_3']).reset_index()
輸出:
Var_1 Var_2 Var_3 Var_4
0 0 Ams Rot 10
1 0 Del Utr 12
2 0 Ams Utr 14
3 0 Del Rot 16
4 1 Ams Rot 10
5 1 Del Utr 12
6 1 Ams Utr 14
7 1 Del Rot 16
8 2 Ams Rot 10
9 2 Del Utr 12
10 2 Ams Utr 14
11 2 Del Rot 16
uj5u.com熱心網友回復:
我們還可以創建一個 DataFrame pairs(這將創建一個具有一行和 MultiIndex 列的 DataFrame),repeat它(因為我們想重復同一行 3 次,我們使用Index.repeat reindex重復 3 次)。然后我們使用reset_index 來獲得正確命名rename_axis和reset_index排序的“Var_1”。然后melt將以所需的形狀傳遞資料。最后,我們可以使用sort_values reset_index來獲得一個與您構建的相同的 DataFrame。
tmp = pd.DataFrame(pairs, index=[0])
out = (tmp.reindex(tmp.index.repeat(3))
.reset_index(drop=True)
.rename_axis('Var_1')
.reset_index()
.melt(id_vars=['Var_1'], var_name=['Var_2', 'Var_3'], value_name='Var_4')
.sort_values(by='Var_1')
.reset_index(drop=True))
輸出:
Var_1 Var_2 Var_3 Var_4
0 0 Ams Rot 10
1 0 Del Utr 12
2 0 Ams Utr 14
3 0 Del Rot 16
4 1 Ams Rot 10
5 1 Del Utr 12
6 1 Ams Utr 14
7 1 Del Rot 16
8 2 Ams Rot 10
9 2 Del Utr 12
10 2 Ams Utr 14
11 2 Del Rot 16
或者您可以撰寫一個串列推導并使用串列構建一個 DataFrame。這與您已經擁有的非常相似。唯一的區別是它不是構建 4 個單獨的串列,而是構建一個串列。
tmp = [[i, j, k, v] for i in range(3) for (j, k), v in pairs.items()]
df = pd.DataFrame(tmp, columns=['Var_1', 'Var_2', 'Var_3', 'Var_4'])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445066.html
標籤:Python python-3.x 熊猫 数据框 for循环
