![](/img/trans.png)
[英]Create new column based on values from other columns / apply a function of multiple columns, row-wise in Pandas
[英]Pandas: Create a new column based on values from other columns (Row wise)
我正在寻找基于几列(
`TOTAL_HH_INCOME','HH_SIZE'
'Eligible Household Size', 'income_min1', 'income_max1', 'hh_size2','income_min2', 'income_max2', 'hh_size3', 'income_min3', 'income_max3', 'hh_size4', 'income_min4', 'income_max4', 'hh_size5', 'income_min5', 'income_max5', 'hh_size6', 'income_min6', 'income_max6'`
我希望比较我的 dataframe 中每一行的 HH Size 与每个 HH size# 变量和 TOTAL_HH_INCOME 与每个income_min 和income_max 变量。
我做了这个 function 作为尝试
def eligibility (row):
if df['HH_SIZE']== df['Eligible Household Size'] & df['TOTAL_HH_INCOME'] >= df['income_min1'] & df['TOTAL_HH_INCOME'] <=row['income_max1'] :
return 'Eligible'
if df['HH_SIZE']== df['hh_size2'] & df['TOTAL_HH_INCOME'] >= df['income_min2'] & df['TOTAL_HH_INCOME'] <=row['income_max2'] :
return 'Eligible'
if df['HH_SIZE']== df['hh_size3'] & df['TOTAL_HH_INCOME'] >= df['income_min3'] & df['TOTAL_HH_INCOME'] <=row['income_max3'] :
return 'Eligible'
if df['HH_SIZE']== df['hh_size4'] & df['TOTAL_HH_INCOME'] >= df['income_min4'] & df['TOTAL_HH_INCOME'] <=row['income_max4'] :
return 'Eligible'
if df['HH_SIZE']== df['hh_size5'] & df['TOTAL_HH_INCOME'] >= df['income_min5'] & df['TOTAL_HH_INCOME'] <=row['income_max5'] :
return 'Eligible'
if df['HH_SIZE']== df['hh_size6'] & df['TOTAL_HH_INCOME'] >= df['income_min6'] & df['TOTAL_HH_INCOME'] <=row['income_max6'] :
return 'Eligible'
return 'Ineligible'
如您所见,如果该行符合条件,我希望该行被标记为“合格”,否则应标记为“不合格”
我将此 function 应用到我的 df
df['Eligibility']= df.apply(eligibility, axis=1)
但是,我收到一个错误:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')
为什么? 我的 function 不合格吗?
编辑:
====================== DATAFRAME ===========================
问题似乎出在 if 语句中的比较运算符:因为您正在比较数据框的列,所以不仅有一个 True 值,而且还有与列中的项目一样多的 True 值。
如果您希望所有元素都相同,请尝试使用 a.all()。 请参考以下示例:
import pandas as pd
dict1 = {'name1': ['tom', 'pedro'], 'name2': ['tom', 'pedro'],
'name3': ['tome', 'maria'], 'name4': ['maria', 'marta']}
df1 = pd.DataFrame(dict1)
# This produce a ValueError as the one you have
# if df1['name1'] == df1['name2']:
# pass
# To see why this produce an error try printing the following:
print('This is a DataFrame of bool values an can not be handle by an if statement: \n',
df1['name1'] == df1['name2'])
# This check if all the elements in 'name1' are the same as in 'name2'
if (df1['name1'] == df1['name2']).all():
print('\nEligible')
Output:
This is a DataFrame of bool values an can not be handle by an if statement:
0 True
1 True
dtype: bool
Eligible
你可以试试这个,使用df.to_records()
:
import re
#df.columns
s=['TOTAL_HH_INCOME','HH_SIZE','Eligible Household Size', 'income_min1', 'income_max1', 'hh_size2','income_min2', 'income_max2', 'hh_size3', 'income_min3', 'income_max3', 'hh_size4', 'income_min4', 'income_max4', 'hh_size5', 'income_min5', 'income_max5', 'hh_size6', 'income_min6', 'income_max6']
def func(row):
totalincome=row[2]
HHSIZE=row[3]
indexhhsize=list(map(s.index,re.findall('(hh_size\d+)',''.join(s))))
indexmax=list(map(s.index,re.findall('(income_max\d+)',''.join(s))))
indexmin=list(map(s.index,re.findall('(income_min\d+)',''.join(s))))
if(any(HHSIZE==row[i+1] for i in indexhhsize))\
|(any(totalincome>=row[i+1] for i in indexmin))\
|(any(totalincome<=row[i+1] for i in indexmax)):
return 'Eligible'
else:
return 'Ineligible'
df['Eligibility']=[func(row) for row in df.to_records()]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.