所以我有一個資料框,它有兩列,狀態和成本,以及一個單獨的新“假設”成本串列
State Cost
A 2
B 9
C 8
D 4
New_Cost_List = [1, 5, 10]
我想為 New_Cost 的每個值復制我的資料集中的所有行,為每個州的每個 New_Cost 添加一個新列。
State Cost New_Cost
A 2 1
B 9 1
C 8 1
D 4 1
A 2 5
B 9 5
C 8 5
D 4 5
A 2 10
B 9 10
C 8 10
D 4 10
我認為 for 回圈可能適合迭代,復制我的資料集以獲得串列的長度并將串列的值添加為新列:
for v in New_Cost_List:
df_new = pd.DataFrame(np.repeat(df.values, len(New_Cost_List), axis=0))
df_new.columns = df.columns
df_new['New_Cost'] = v
此輸出為我提供了 State 和 Cost 的正確復制,但每行的 New_Cost 值為 10。顯然我沒有連接如何讓它通過每個復制集的串列運行,所以有什么建議嗎?還是有更好的方法來解決這個問題?
編輯 1
將 New_Cost_List 中的值數量從 4 減少到 3,因此串列的行數和長度有所不同。
uj5u.com熱心網友回復:
這是一種使用keys引數的方法pd.concat():
(pd.concat([df]*len(New_Cost_List),
keys = New_Cost_List,
names = ['New_Cost',None])
.reset_index(level=0))
輸出:
New_Cost State Cost
0 1 A 2
1 1 B 9
2 1 C 8
3 1 D 4
0 5 A 2
1 5 B 9
2 5 C 8
3 5 D 4
0 10 A 2
1 10 B 9
2 10 C 8
3 10 D 4
uj5u.com熱心網友回復:
如果我正確理解您的問題,這應該可以解決您的問題。
df['New Cost'] = new_cost_list
df = pd.concat([df]*len(new_cost_list), ignore_index=True)
輸出:
State Cost New Cost
0 A 2 1
1 B 9 5
2 C 8 10
3 D 4 15
4 A 2 1
5 B 9 5
6 C 8 10
7 D 4 15
8 A 2 1
9 B 9 5
10 C 8 10
11 D 4 15
12 A 2 1
13 B 9 5
14 C 8 10
15 D 4 15
uj5u.com熱心網友回復:
您可以使用index.repeat和numpy.tile:
df2 = (df
.loc[df.index.repeat(len(New_Cost_List))]
.assign(**{'New_Cost': np.repeat(New_Cost_List, len(df))})
)
或者,簡單地說,使用cross merge:
df2 = df.merge(pd.Series(New_Cost_List, name='New_Cost'), how='cross')
輸出:
State Cost New_Cost
0 A 2 1
0 A 2 5
0 A 2 10
1 B 9 1
1 B 9 5
1 B 9 10
2 C 8 1
2 C 8 5
2 C 8 10
3 D 4 1
3 D 4 5
3 D 4 10
對于提供的訂單:
(df
.merge(pd.Series(New_Cost_List, name='New_Cost'), how='cross')
.sort_values(by='New_Cost', kind='stable')
.reset_index(drop=True)
)
輸出:
State Cost New_Cost
0 A 2 1
1 B 9 1
2 C 8 1
3 D 4 1
4 A 2 5
5 B 9 5
6 C 8 5
7 D 4 5
8 A 2 10
9 B 9 10
10 C 8 10
11 D 4 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/461275.html
