根据频率 table 和 python 计算每个地区的中位年龄

calculate the median age for each region from frequency table with python

我的数据框类似于:

我想计算每个城市的平均年龄,但考虑到它是一个频率 table,我发现这有点棘手。 pandas 或其他功能中是否有任何功能可以帮助我实现此目标?

对于每一行,找出其中的实例数。然后将该数字除以 2,并通过检查年龄是否小于我们正在寻找的人数来确定年龄。

例如,对于行 'alabama',您将添加 34 + 67 + ... + 23 = 5463。除以 2,将是 2731.5 ==> 2731。然后,检查每个年龄段,判断第2731个人在哪

  • 1岁时,因为2731 > 34,检查下一个。
  • 2岁时,由于2731 > 34 + 67,检查下一个。
  • 3岁时,由于2731 > 34 + 67 + 89,检查下一个。
  • 4岁时,由于2731 > 34 + 67 + 89 + 89,检查下一个。
  • 5岁时,由于2731 > 34 + 67 + 89 + 89 + 67,检查下一个。
  • 6岁时,由于2731 > 34 + 67 + 89 + 89 + 67 + 545,检查下一个。
  • 在 7 岁时,因为 2731 < 34 + 67 + 89 + 89 + 67 + 545 + 4546,中位数必须在这个年龄组。

对每个 city/state 重复此操作,您应该得到每个的中位数。

也许这对你有用:

import numpy as np
import pandas as pd

# create dataframe
df = pd.DataFrame(
    [
        ['Alabama', 34, 67, 89, 89, 67, 545, 4546, 3, 23], 
        ['Georgia', 345, 65, 67, 32, 23, 567, 87, 647, 68]
    ],
    columns=['City', 0, 1, 2, 3, 4, 5, 6, 7, 8]
).set_index('City')
print(df)

# calculate median for freq table
m = list() # median list
for index, row in df.iterrows():
    v = list() # value list
    z = zip(row.index, row.values)
    for item in z:
        for f in range(item[1]):
            v.append(item[0])
    m.append(np.median(v))
df_m = pd.DataFrame({'City': df.index, 'Median': m})
print(df_m)

输入:

           0   1   2   3   4    5     6    7   8
City                                            
Alabama   34  67  89  89  67  545  4546    3  23
Georgia  345  65  67  32  23  567    87  647  68

输出:

      City  Median
0  Alabama     6.0
1  Georgia     5.0