Pandas:根据条件更新数据框架

ogsagwnx  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(159)
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,但希望看看是否存在更干净的方法?

idv4meu8

idv4meu81#

您可以将Max和Count合并回分解的 Dataframe ,然后按Max和Count对其进行排序,然后为每个索引选择第一条记录。此外,当groupby holiday时,可以设置dropna False以保留None组。

df_explode = df.explode('holiday')
# keep the None group
result_count = df_explode.groupby('holiday', dropna=False).agg(Max=('result', 'max'), Count=('result', 'count')).reset_index()
df_explode = df_explode.merge(result_count, how='left')
result = df_explode.sort_values(['Max', 'Count'], ascending=False).groupby('index').first()
result = result.reset_index().drop(['Max', 'Count'], axis=1)

相关问题