簡體   English   中英

遍歷應用函數的數據框的每一列並將結果另存為新列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM