![](/img/trans.png)
[英]apply function on subset of dataframe rows in column based on value in other column
[英]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()
的文檔,但我無法弄清楚如何將其付諸實踐。
我正在努力從函數中引用其他列的語法,因為我需要訪問number
和condition
列中的值。
因此,我的預期輸出是:
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
的同一行的funcA或funcB 。 如果將應用funcA或funcB,則使用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.