我有一個資料框,如:

所以我想通過兩個“for回圈”添加一些列,例如:
像圖片這樣的新資料框:

我的代碼不起作用:
for I in range(0,len(df["date"]):
for sigma in rang(1,2/5):
df["P*sigma"].iloc[0:i]=df["p"].iloc[0:i]*df["sigma"].iloc[sigma]
print(df)
我如何撰寫代碼來獲取像第二張圖片一樣的資料幀?
uj5u.com熱心網友回復:
您可以使用MultiIndex來做到這一點,這可以通過多種方式完成,但我總是更喜歡使用from_product().
請注意,在執行此操作之前,我們必須做一些準備作業。我們必須確保在原始 DataFrame 上正確設定了索引,并且我們必須延長原始 DataFrame 以允許新行。
import pandas as pd
df = pd.DataFrame({'date': ['2020/01/01', '2020/01/02', '2020/01/03'], 'p': [123, 231, 188]})
df = df.set_index('date')
sigma = [0, 1, 2, 5]
# Create new 2-level index
multi_index = pd.MultiIndex.from_product([sigma, df.index], names=['sigma', 'date'])
# Make longer
df = pd.concat([df] * len(sigma))
# Set new index
df = df.set_index(multi_index)
# Print result
print(df.head())
>>> p
>>> sigma p
>>> 0 2020/01/01 123
>>> 2020/01/02 231
>>> 2020/01/03 188
>>> 1 2020/01/01 123
>>> 2020/01/02 231
如果你想創建新列或使用索引值,你可以得到get_level_values()這樣的:
df["p*sigma"] = df.index.get_level_values("sigma") * df["p"]
print(df.head())
>>> p p*sigma
>>> sigma date
>>> 0 2020/01/01 123 0
>>> 2020/01/02 231 0
>>> 2020/01/03 188 0
>>> 1 2020/01/01 123 123
uj5u.com熱心網友回復:
像這樣添加行和列“sigma”后,您可以使用 DataFrame.apply 之類的
df["P*sigma"] = df.apply(lambda x: x["p"] * x["sigma"], axis=1)
uj5u.com熱心網友回復:
在 python 中,您可以使用乘法符號重復陣列*。如果您有空閑的列sigma,date并且p很容易以正確的形狀定義 DataFrame。要創建新列,只需執行元素乘法(不需要apply()呼叫。之后,如果需要,您可以設定索引。
import pandas as pd
sigma = [0.5, 1, 2, 2/5]
date = ['2020/01//02', '2020/01//03', '2020/01//04']
p = [123,231,188]
df = pd.DataFrame({'sigma':sigma*len(p), 'date':date*len(sigma), 'p':p*len(sigma)})
df['p*sigma'] = df['p']*df['sigma']
df.set_index(['sigma', 'date'], inplace=True)
>>>df
p p*sigma
sigma date
0.5 2020/01//02 123 61.5
1.0 2020/01//03 231 231.0
2.0 2020/01//04 188 376.0
0.4 2020/01//02 123 49.2
0.5 2020/01//03 231 115.5
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325888.html
