如何找到每年事件的中位数?熊猫按数据科学问题分组

问题描述 投票:0回答:1

我有一个数据集,其中每一行都是恐怖主义事件,我想找到每个国家/地区单位中每次袭击造成的死亡人数中位数。在 df1 中,每一行都是一个恐怖主义事件,其中包含 iyear、country、nkill 和 NumbAttack 列。在 df2 中,每一行都是一个国家/地区-年单位,其中包含国家/地区、iyear、totalnkill、NumbAttackperYear 和 MedKillperAttack 列。

从 df1 开始:

国家 一年 杀掉 麻木攻击
尼日利亚 2000 4 1
尼日利亚 2000 7 1
尼日利亚 2000 10 1
尼日利亚 2002 10 1
马里 2000 2 1
马里 2000 12 1
马里 2000 17 1
马里 2001 12 1
马里 2001 15 1

以 df2 结尾: |国家|一年 |总杀|每年麻木攻击次数| MedKillperAttack| | -------- | -------- |---------|------------|------------| |尼日利亚 | 2000 | 2000 21 | 21 3 | 7 | |尼日利亚 | 2001 | 0 | 0 | 0 | |尼日利亚 | 2002 | 10 | 10 1 | 10 | 10 |马里 | 2000 | 2000 21 | 21 3 | 12 | 12 |马里 | 2001 | 27 | 27 2 | 13.5 |

我了解如何使用group by来获取totalnkill和NumbAttack:

df2 = df1.groupby(['country', 'iyear'])['nkill', 'NumbAttack'].sum()

然后重命名列:

df2 = df2.rename(columns={'nkill': 'totalnkill', 'NumbAttack': 'NumbAttackperYear'})

这部分有效!但我无法找出一种算法或想法来查找每个国家年单位每次袭击造成的死亡人数中位数。我知道如何通过仅将总杀戮除以 NumbAttackperYear 来获取平均值,而不是中位数。我对编码真的很陌生,所以我很难理解文档等中的信息,请帮助!如果你能解释一下你在做什么,如果它很复杂的话,那就太好了,这样我就可以学习。谢谢!

python pandas group-by data-science median
1个回答
0
投票

以下是如何在 Python 中找到每个国家/地区年单位中每次袭击造成的死亡人数中位数:

import pandas as pd

# Assuming your data is in a DataFrame called 'df1'

# Group data by country and year
df_grouped = df1.groupby(['country', 'iyear'])


# Calculate median kills per attack within each group
def calculate_median_kills(group):
  return group['nkill'].median()

df2 = df_grouped['nkill'].apply(calculate_median_kills)

# Reset index to create separate columns for country and year
df2 = df2.reset_index()

# Rename the column with median kills
df2.columns = ['country', 'iyear', 'MedKillperAttack']

# You can now merge this DataFrame with df2 if needed

说明:

导入pandas:我们导入pandas库进行数据操作。 对数据进行分组:我们使用groupby按国家和iyear对数据进行分组。这会创建组,其中每个组代表特定国家和年份的攻击。

定义中位数计算函数:我们定义一个名为calculate_median_kills的函数,它接受一个组作为输入。此函数使用中位数方法计算该组内 nkill 列的中位数。

应用函数:我们在分组的DataFrame上使用apply方法,并将calculate_median_kills函数作为参数传递。这将该函数应用于每个组,计算每个国家/地区年份的杀戮中位数。

重置索引: apply 方法会产生一个系列。我们使用 Reset_index 将其转换回 DataFrame,其中包含国家和年份的单独列。 重命名列:我们将包含中位数杀戮的列重命名为 MedKillperAttack。

理解代码:

groupby操作根据指定的列将数据组织成更小的块。

apply方法允许您在每个组上独立执行自定义函数。在本例中,我们计算每组内的中位数。 reset_index 将分组结果转换回常规 DataFrame,其中组键变为列。

© www.soinside.com 2019 - 2024. All rights reserved.