[英]Looping through each column of a dataframe applying a function and save the result as a new column
我使用以下兩行代碼來計算公式的值,並將結果另存為同一數據框中的新列。 該公式將數據幀(df_H)的每一列的值乘以字典(H)中的值,然后將這些值(單行)相加,然后將其除以字典中所有值的總和,然后保存結果在新列的同一行中(df_H [“ COI”])。
H = {'G1_H':9.5438, 'G2_H':3.921565, 'G3_H':2.939454}
df_H['COI'] = pd.Series(((df_H.G1 * H['G1_H']) + (df_H.G3 *H['G3_H']) + ...)/(H['G1_H']+H['G3_H']+...), index=df_H.index)
現在,我想重新編寫相同的代碼,以便它遍歷所有列並執行相同的操作。 列的數量和字典的項目基於模擬而變化,但是,列的數量始終等於字典的項目的數量。
使您的方法更通用的一種方法是執行標量*列乘法,而不必顯式命名每個列。
如果可以確定H
字典鍵始終與DataFrame列名完全匹配,請嘗試以下操作:
# Multiply each DF column with its corresponding dict value
temp = df_H.transform(lambda x: x * H[x.name])
# Add up transformed rows and divide by the sum of all dict values
df_H['COI'] = temp.sum(axis=1) / sum(H.values())
df_H = pd.DataFrame({'G1_H': [0, 1, 2, 3], 'G2_H': [2, 4, 6, 8], 'G3_H': [-1, 0, 1, 2]})
H = dict(G1_H=1, G2_H=2, G3_H=3)
temp = df_H.transform(lambda x: x * H[x.name])
df_H['COI'] = temp.sum(axis=1) / sum(H.values())
H
{'G1_H': 1, 'G2_H': 2, 'G3_H': 3}
temp
G1_H G2_H G3_H
0 0 4 -3
1 1 8 0
2 2 12 3
3 3 16 6
df_H
G1_H G2_H G3_H COI
0 0 2 -1 0.166667
1 1 4 0 1.500000
2 2 6 1 2.833333
3 3 8 2 4.166667
temp = df_H.transform(lambda x: x * H[x.name])
df.transform()
作用是處理df
每一列 ,並為每一列返回與輸入列長度相同的結果。 因此,運行df.transform()
始終會導致DataFrame具有相同的形狀。
df.transform()
接受一個函數,在這種情況下是lambda函數(該函數沒有就地定義名稱,而不是預先定義def func_name(arg1):
。
lambda x: x * H[x.name]
對df
每一列“ x
”說,將其乘以鍵值為x.name
的字典值,該字典值是每一列的名稱。 (請記住, DataFrame
中的列只是Series
,每個列的名稱都可以通過Series.name
訪問。)該函數起作用是因為python字典H
鍵與DF中的列完全匹配。
df_H['COI'] = temp.sum(axis=1) / sum(H.values())
按照操作順序,此行首先將temp
每一行中的值相加(由於axis=1
),從而得到其中只包含一列的Series。 (大多數熊貓方法的默認維數是axis=0
,它作用於每列中的值,在這里不起作用。)
然后,將求和的結果逐個元素除以所有字典值sum(H.values())
,它是一個標量。 Pandas(實際上是numpy)知道通過除法操作跨向量“標量”標量,完成了大多數人期望代碼執行的操作(有關numpy廣播的更多信息,請訪問: https : //docs.scipy.org/doc/numpy /user/basics.broadcasting.html )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.