pandas 使用apply后如何从分组元素中获取 Dataframe

ih99xse1  于 2023-05-05  发布在  其他
关注(0)|答案(2)|浏览(161)

让我们假设这个dataframe:

First Name  Last Name   Val1 
George      Clooney      N     
George      Clooney      N   
George      Clooney      Y
George      Freeman      N
George      Freeman      N
Claire      Stark        N
Claire      Stark        Y

那么我们的目标就是生产这个:

First Name  Last Name   Val1  Total
George      Clooney      Y      3
George      Freeman      N      2
Claire      Stark        Y      2

只要其中一个示例为Y,则Val1的总数为Y
我的代码看起来像这样:

grouped = df.groupby(by=['First Name', 'Last Name'])

def val_func(x):
    if (x['Val1'] == 'Y').any():
    return 'Y'
    else:
    return 'N'

cumulative = grouped.apply(val_func)

除了cumulative的dtype是object,我只能访问Val1,也就是说,我不能访问First NameLast Name(尽管当我运行print(cumulative)时,它会打印所有内容)。
如果我尝试:

df_cumulative = pd.DataFrame(cumulative)

然后,我只得到YN的列,而不是名称。
如何解决这个问题?此外,我可以返回两个参数吗?一个用于Val1,一个用于Total?或者我必须运行另一个apply for Total并将列附加到dataframe?

k75qkfdt

k75qkfdt1#

另一种方法是使用groupby.agg,其中使用max获得“Y”(如果它存在)(因为Y>N)和count

out = df.groupby(['First Name', 'Last Name'], sort=False, as_index=False)\
        .agg(Val1=('Val1', 'max'), Total=('Val1', 'count'))

输出:

First Name Last Name Val1  Total
0     George   Clooney    Y      3
1     George   Freeman    N      2
2     Claire     Stark    Y      2

你可以传入一个lambda,它根据你想要的任何条件进行选择。例如,以下聚合“Val1”基于“Y”的数量是否大于“N”的数量(如果存在更多“Y”,则选择“Y”,否则选择“N”):

out = df.groupby(['First Name', 'Last Name'], sort=False, as_index=False)\
        .agg(Val1=('Val1', lambda x: 'Y' if x.eq('Y').sum() > x.eq('N').sum() else 'N'), 
             Total=('Val1', 'count'))
k2arahey

k2arahey2#

这里有一个方法:

(df.sort_values('Val1')
 .groupby(['First Name','Last Name'])
 .agg(Val1 = ('Val1','max'),count = ('Val1','count'))
 .reset_index())

输出:

First Name Last Name Val1  count
0     Claire     Stark    Y      2
1     George   Clooney    Y      3
2     George   Freeman    N      2

相关问题