簡體   English   中英

在python / pandas的多列中應用相似的功能

[英]Applying similar functions across multiple columns in python/pandas

問題:考慮到下面的數據框,我試圖提供將一個函數應用於三個不同列的代碼,而不必編寫三個單獨的函數調用。

數據代碼:

import pandas as pd
data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
    'days': [365, 365, 213, 318, 71],
    'spend_30day': [22, 241.5, 0, 27321.05, 345],
    'spend_90day': [22, 451.55, 64.32, 27321.05, 566.54],
    'spend_365day': [854.56, 451.55, 211.65, 27321.05, 566.54]}

df = pd.DataFrame(data)
cols = df.columns.tolist()
cols = ['name', 'days', 'spend_30day', 'spend_90day', 'spend_365day']
df = df[cols]
df

以下功能實質上將支出年度化; 如果某人在“天數”列中少於365天,則以下功能將告訴我,如果他們有365天,支出將是多少:

def annualize_spend_365(row):
    if row['days']/(float(365)) < 1:
        return (row['spend_365day']/(row['days']/float(365)))
    else:
        return row['spend_365day']

然后,我將該函數應用於特定的列:

df.spend_365day = df.apply(annualize_spend_365, axis=1).round(2)
df

這與我希望的那一欄完全一樣。 但是,我不想為三個不同的“支出”列(30、90、365)中的每一個都重寫它。 我希望能夠編寫將代碼概括化並將此功能一次應用到多列的代碼。

我以為可以創建各列及其各自日子的列表,使用“ zip”函數,然后將該函數嵌套在for循環中,但是我在下面的嘗試最終失敗了:

spend_cols = [df.spend_30day, df.spend_90day, df.spend_365day]
days_list = [30, 90, 365]

for col, day in zip(spend_cols, days_list):
    def annualize_spend(row):
        if (row.days/(float(day)) < 1:
            return (row.col)/((row.days)/float(day))
        else:
            return row.col
    col = df.apply(annualize_spend, axis = 1)

錯誤:

AttributeError: ("'Series' object has no attribute 'col'")

我不確定循環方法為什么會失敗。 無論如何,我希望獲得有關如何在熊貓中泛化函數應用程序的指導。 提前致謝!

查看您的兩個函數定義:

def annualize_spend_365(row):
    if row['days']/(float(365)) < 1:
        return (row['spend_365day']/(row['days']/float(365)))
    else:
        return row['spend_365day']

#col in [df.spend_30day, df.spend_90day, df.spend_365day]
def annualize_spend(row):
    if (row.days/(float(day)) < 1:
        return (row.col)/((row.days)/float(day))
    else:
        return row.col

看到不同? 一方面,在第一種情況下,您使用顯式字段名稱訪問字段,並且該字段有效。 在第二種情況下,您嘗試訪問row.col ,該操作失敗,但是在這種情況下, col假定df相應字段的值 試一試

spend_cols = ['spend_30day', 'spend_90day', 'spend_365day']

在循環之前。 另一方面,在語法df.days ,字段名稱實際上是“ days”,但是在df.col ,字段名稱不是字符串“ col”,而是字符串col 因此,在后一種情況下,您可能還想使用row[col] 而且無論如何,我不確定在col循環中將col作為輸出變量是多么明智。


我不熟悉pandas.DataFrame.apply ,但是可能可以使用單個函數定義,該函數將天數和感興趣的字段作為輸入變量:

def annualize_spend(col,day,row):
    if (row['days']/(float(day)) < 1:
        return (row[col])/((row['days'])/float(day))
    else:
        return row[col]

spend_cols = ['spend_30day', 'spend_90day', 'spend_365day']
days_list = [30, 90, 365]

for col, day in zip(spend_cols, days_list):
    col = df.apply(lambda row,col=col,day=day: annualize_spend(col,day,row), axis = 1)

lambda將確保在apply d時,函數的只有一個輸入參數自由懸掛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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