import pandas as pd
# create the DataFrame
df = pd.DataFrame({
'index': [1, 2, 3, 4, 5, 6, 7],
'result': [80, 85, 90, 91, 92, 93, 94],
'holiday': ['Dam', 'Dam', 'Easter', ['Easter', 'TomTom'], ['TomTom', 'Christmas'], None, ['Birthday', 'Halloween']]
})
# split the holiday lists into separate rows
df = df.explode('holiday')
# group by holiday name and find the maximum result and count of friends
result_count = df.groupby('holiday').agg(Max=('result', 'max'), Count=('result', 'count')).reset_index()
# create the DataFrame
df_out = pd.DataFrame({
'index': [1, 2, 3, 4, 5, 6, 7],
'result': [80, 85, 90, 91, 92, 93, 94],
'holiday': ['Dam', 'Dam', 'Easter', 'TomTom', 'TomTom', None, 'Birthday']
})
上面是我的 Dataframe 和预期的 Dataframe 。我希望转换原始 Dataframe ,以便将列表中的假日替换为具有最大结果的单个假日,如果两个假日具有相同的结果,则由最大计数替换,如果偶数计数相同,则由任何一个假日替换。我能够通过循环遍历每一行并执行大量的if else来获得df_out,但希望看看是否存在更干净的方法?
1条答案
按热度按时间idv4meu81#
您可以将Max和Count合并回分解的 Dataframe ,然后按Max和Count对其进行排序,然后为每个索引选择第一条记录。此外,当groupby holiday时,可以设置dropna False以保留None组。