我正在处理泰坦尼克号数据集
一张票可以为多个乘客发行,即。E多个乘客可能有相同的车票号码
所有这些乘客的“票价”功能将与全部票价相同且相等
例如,如果有4名乘客乘坐一张票,票价可以是40美元,但每位乘客的票价应该是10美元。
因此,我们应该将票价除以车票频率来计算每位乘客的票价。
但还有一件事:婴儿票价为2美元,12岁以下儿童票价为成人票价的一半。
因此,我试图在考虑儿童票价的情况下,计算门票中每个成人支付的价格。
以下是一个示例数据框:
df = pd.DataFrame({'Age': [0.5,5,20,21,22,23,24], 'Fare': [17,17,17,40,40,40,40], 'TicketNum': [1,1,1,2,2,2,2]})
Age Fare TicketNum
0 0.5 17 1
1 5.0 17 1
2 20.0 17 1
3 21.0 40 2
4 22.0 40 2
5 23.0 40 2
6 24.0 40 2
首先我做这个函数:
def fare_calc(x):
ticket_fare = x['Fare'].mean()
group_size = x.shape[0]
babies_count = x[x['Age']<1].count()
child_count = x[x['Age']<12].count()
adult_count = group_size - babies_count - child_count
adult_fare = (ticket_fare - babies_count * 2) / (adult_count + child_count*0.5)
return adult_fare
然后我尝试:
df['TicketFreq'] = df.groupby('TicketNum')['TicketNum'].transform('count')
df['Fare2'] = df[df.TicketFreq>1].groupby(['TicketNum'])['Age','Fare'].agg(fare_calc)
并得到一个错误:
ValueError:传递的项目数错误2,放置意味着1
所需输出如下:
Age Fare TicketNum Fare2
0 0.5 17 1 10
1 5.0 17 1 10
2 20.0 17 1 10
3 21.0 40 2 10
4 22.0 40 2 10
5 23.0 40 2 10
6 24.0 40 2 10
一个次要但直接的问题是,在最后一行代码中,
['Age', 'Fare']
应该是[['Age', 'Fare']]
,因为您希望使用列名列表进行索引主要问题是您已经编写了
fare_calc()
来处理整个数据帧,但是传递给df.agg()
的函数将分别应用于每个列嘿,您的公式似乎是错误的,但是
fare_calc
函数在您用.apply
替换.agg
调用并删除指定的两列时执行。见下面的例子此外,您的功能只需要进行一些更改
要获取babie_计数和child_计数的数字numver,您需要指定一个列以仅获取一个整数
这是我的解决办法
我使用
pd.Series()
和.repeat()
函数创建列式值序列顺便说一句,您忘记了使用
(df['Age']<12) & (df['Age']>1)
将babies\u count从child\u count中排除最后,使用
.values
单独提取由apply
函数创建的堆叠序列的值,以防止出现“不兼容索引”类型错误编辑1:以前功能的更直观版本:
编辑2:如果直接在函数内部创建“Fare2”,则更简单
相关问题 更多 >
编程相关推荐