让我们假设这个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 Name
或Last Name
(尽管当我运行print(cumulative)
时,它会打印所有内容)。
如果我尝试:
df_cumulative = pd.DataFrame(cumulative)
然后,我只得到Y
或N
的列,而不是名称。
如何解决这个问题?此外,我可以返回两个参数吗?一个用于Val1
,一个用于Total
?或者我必须运行另一个apply for Total
并将列附加到dataframe?
2条答案
按热度按时间k75qkfdt1#
另一种方法是使用
groupby.agg
,其中使用max
获得“Y”(如果它存在)(因为Y>N
)和count
:输出:
你可以传入一个lambda,它根据你想要的任何条件进行选择。例如,以下聚合“Val1”基于“Y”的数量是否大于“N”的数量(如果存在更多“Y”,则选择“Y”,否则选择“N”):
k2arahey2#
这里有一个方法:
输出: