簡體   English   中英

根據同一行的其他列中的值將函數應用於dataframe列元素?

[英]Apply function to dataframe column element based on value in other column for same row?

我有一個數據幀:

df = pd.DataFrame(
    {'number': ['10', '20' , '30', '40'], 'condition': ['A', 'B', 'A', 'B']})

df = 
    number    condition
0    10         A
1    20         B
2    30         A
3    40         B

我想將一個函數應用於數字列中的每個元素,如下所示:

 df['number'] = df['number'].apply(lambda x: func(x))

但是,即使我將函數應用於數字列,我希望函數也引用condition列,即偽代碼:

func(n):
    #if the value in corresponding condition column is equal to some set of values:
        # do some stuff to n using the value in condition
        # return new value for n

對於單個數字,我會寫一個示例函數:

number = 10
condition = A
def func(num, condition):
    if condition == A:
        return num*3
    if condition == B:
        return num*4

func(number,condition) = 15

如何將相同的功能合並到我上面寫的apply語句中? 即引用條件列中的值,同時對數字列中的值進行操作?

注意:我已經閱讀了關於np.where()pandas.loc()pandas.index()的文檔,但我無法弄清楚如何將其付諸實踐。

我正在努力從函數中引用其他列的語法,因為我需要訪問numbercondition列中的值。

因此,我的預期輸出是:

df = 
    number    condition
0    30         A
1    80         B
2    90         A
3    160         B

更新:以上內容太模糊了。 請參閱以下內容:

df1 = pd.DataFrame({'Entries':['man','guy','boy','girl'],'Conflict':['Yes','Yes','Yes','No']})


    Entries    Conflict
0    "man"    "Yes"
1    "guy"    "Yes"
2    "boy"    "Yes"
3    "girl"   "No

def funcA(d):
    d = d + 'aaa'
    return d
def funcB(d):
    d = d + 'bbb'
    return d

df1['Entries'] = np.where(df1['Conflict'] == 'Yes', funcA, funcB)

Output:
{'Conflict': ['Yes', 'Yes', 'Yes', 'Np'],
 'Entries': array(<function funcB at 0x7f4acbc5a500>, dtype=object)}

如何應用上面的np.where語句來獲取注釋中提到的pandas系列,並生成如下所示的所需輸出:

期望的輸出:

    Entries    Conflict
0    "manaaa"    "Yes"
1    "guyaaa"    "Yes"
2    "boyaaa"    "Yes"
3    "girlbbb"   "No

由於問題是關於同一行的數據幀列的apply函數,使用pandas apply funtion與lambda結合似乎更准確:

import pandas as pd
df = pd.DataFrame({'number': [10, 20 , 30, 40], 'condition': ['A', 'B', 'A', 'B']})

def func(number,condition):
    multiplier = {'A': 2, 'B': 4}
    return number * multiplier[condition]

df['new_number'] = df.apply(lambda x: func(x['number'], x['condition']), axis=1)

在此示例中, lambda獲取數據幀df的列'number''condition' ,並使用apply將同一行的這些列應用於函數func

這將返回以下結果:

df
Out[10]: 
 condition  number  new_number
0   A   10  20
1   B   20  80
2   A   30  60
3   B   40  160

對於UPDATE情況,它也可以使用pandas apply函數:

df1 = pd.DataFrame({'Entries':['man','guy','boy','girl'],'Conflict':['Yes','Yes','Yes','No']})

def funcA(d):
    d = d + 'aaa'
    return d
def funcB(d):
    d = d + 'bbb'
    return d

df1['Entries'] = df1.apply(lambda x: funcA(x['Entries']) if x['Conflict'] == 'Yes' else funcB(x['Entries']), axis=1)

在此示例中, lambda獲取數據幀df的列'Entries''Conflict' ,並將這些列應用於使用apply的同一行的funcAfuncB 如果將應用funcAfuncB,則使用lambda中的if-else子句完成該條件。

這將返回以下結果:

df
Out[12]:


    Conflict    Entries
0   Yes     manaaa
1   Yes     guyaaa
2   Yes     boyaaa
3   No  girlbbb

我不知道使用pandas.DataFrame.apply ,但你可以定義一個特定condition:multiplier鍵值映射(見下面的multiplier ),並將其傳遞給你的函數。 然后,您可以使用列表推導來根據這些條件計算新的number輸出:

import pandas as pd
df = pd.DataFrame({'number': [10, 20 , 30, 40], 'condition': ['A', 'B', 'A', 'B']})

multiplier = {'A': 2, 'B': 4}

def func(num, condition, multiplier):
    return num * multiplier[condition]

df['new_number'] = [func(df.loc[idx, 'number'], df.loc[idx, 'condition'], 
                     multiplier) for idx in range(len(df))]

這是結果:

df
Out[24]: 
  condition  number  new_number
0         A      10          30
1         B      20          80
2         A      30          90
3         B      40         160

可能有一種矢量化的純熊貓解決方案更“理想”。 但這也適用於緊要關頭。

暫無
暫無

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

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