Python将函数应用于分组数据帧

2024-05-15 06:13:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理泰坦尼克号数据集
一张票可以为多个乘客发行,即。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

Tags: 数据childdfagecount儿童车票成人
3条回答

一个次要但直接的问题是,在最后一行代码中,['Age', 'Fare']应该是[['Age', 'Fare']],因为您希望使用列名列表进行索引

主要问题是您已经编写了fare_calc()来处理整个数据帧,但是传递给df.agg()的函数将分别应用于每个列

嘿,您的公式似乎是错误的,但是fare_calc函数在您用.apply替换.agg调用并删除指定的两列时执行。见下面的例子

df[df.TicketFreq>1].groupby(['TicketNum']).apply(fare_calc)

此外,您的功能只需要进行一些更改
要获取babie_计数和child_计数的数字numver,您需要指定一个列以仅获取一个整数

def fare_calc(x):
    ticket_fare = x['Fare'].mean()
    group_size = x.shape[0]
    babies_count = x[x['Age']<1]['Age'].count()
    child_count = x[x['Age']<12]['Age'].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

这是我的解决办法

我使用pd.Series().repeat()函数创建列式值序列

顺便说一句,您忘记了使用(df['Age']<12) & (df['Age']>1)将babies\u count从child\u count中排除

def fare_calc(x):
    group_size   = x.shape[0]
    ticket_fare  = pd.Series(x['Fare'].mean().repeat(group_size))
    babies_count = x[x['Age']<1 ]['Age'].count()
    child_count  = x[(df['Age']<12) & (df['Age']>1)]['Age'].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

最后,使用.values单独提取由apply函数创建的堆叠序列的值,以防止出现“不兼容索引”类型错误

df['Fare2'] = df[df.TicketFreq>1].groupby(['TicketNum']).apply(fare_calc).values

print(df)
    Age  Fare  TicketNum  TicketFreq  Fare2
0   0.5    17          1           3   10.0
1   5.0    17          1           3   10.0
2  20.0    17          1           3   10.0
3  21.0    40          2           4   10.0
4  22.0    40          2           4   10.0
5  23.0    40          2           4   10.0
6  24.0    40          2           4   10.0

编辑1:以前功能的更直观版本:

import pandas as pd

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]})
df['TicketFreq'] = df.groupby('TicketNum')['TicketNum'].transform('count')

def fare_calc(x):
    group_size       = x.shape[0]
    x['ticket_fare'] = x['Fare'].mean()
    babies_count     = x[x['Age']<1 ]['Age'].count()
    child_count      = x[(df['Age']<12) & (df['Age']>1)]['Age'].count()
    adult_count      = group_size - babies_count - child_count
    x['adult_fare']  = (x['ticket_fare'] - babies_count * 2) / (adult_count + child_count * 0.5)
    return x['adult_fare']

df['Fare2'] = df[df.TicketFreq>1].groupby(['TicketNum']).apply(fare_calc).values

print(df)
    Age  Fare  TicketNum  TicketFreq  Fare2
0   0.5    17          1           3   10.0
1   5.0    17          1           3   10.0
2  20.0    17          1           3   10.0
3  21.0    40          2           4   10.0
4  22.0    40          2           4   10.0
5  23.0    40          2           4   10.0
6  24.0    40          2           4   10.0

编辑2:如果直接在函数内部创建“Fare2”,则更简单

import pandas as pd

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]})
df['TicketFreq'] = df.groupby('TicketNum')['TicketNum'].transform('count')

def fare_calc(x):
    group_size       = x.shape[0]
    ticket_fare      = x['Fare'].mean()
    babies_count     = x[x['Age']<1 ]['Age'].count()
    child_count      = x[(df['Age']<12) & (df['Age']>1)]['Age'].count()
    adult_count      = group_size - babies_count - child_count
    x['Fare2']       = (ticket_fare - babies_count * 2) / (adult_count + child_count * 0.5)
    return x

df = df[df.TicketFreq>1].groupby(['TicketNum']).apply(fare_calc)

print(df)
    Age  Fare  TicketNum  TicketFreq  Fare2
0   0.5    17          1           3   10.0
1   5.0    17          1           3   10.0
2  20.0    17          1           3   10.0
3  21.0    40          2           4   10.0
4  22.0    40          2           4   10.0
5  23.0    40          2           4   10.0
6  24.0    40          2           4   10.0

相关问题 更多 >

    热门问题