【发布时间】:2021-01-07 01:29:23
【问题描述】:
存在以下数据框:
| year | pop0 | pop1 | city0 | city1 |
|---|---|---|---|---|
| 2019 | 20 | 40 | Malibu | NYC |
| 2018 | 8 | 60 | Sydney | Dublin |
| 2018 | 36 | 23 | NYC | Malibu |
| 2020 | 17 | 44 | Malibu | NYC |
| 2019 | 5 | 55 | Sydney | Dublin |
我想将每个城市对的人口加权平均值计算为一个新列。例如,w_mean 代表 Malibu / NYC = (23+20+17)/(36+40+44) = 0.5。
以下是所需的输出:
| year | pop0 | pop1 | city0 | city1 | w_mean |
|---|---|---|---|---|---|
| 2018 | 23 | 36 | Malibu | NYC | 0.5 |
| 2019 | 20 | 40 | Malibu | NYC | 0.5 |
| 2020 | 17 | 44 | Malibu | NYC | 0.5 |
| 2018 | 8 | 60 | Sydney | Dublin | 0.113 |
| 2019 | 5 | 55 | Sydney | Dublin | 0.113 |
我已经按列对数据框进行了排序,但是在将第 3 行从 NYC/Malibu 交换到 Malibu/NYC 的人口时遇到问题。除此之外,我只能为每一行计算w_mean,但不能为每一组计算。我尝试了groupby().mean(),但没有得到任何有用的输出。
当前代码:
import pandas as pd
data = pd.DataFrame({'year': ["2019", "2018", "2018", "2020", "2019"], 'pop0': [20,8,36,17,5], 'pop1': [40,60,23,44,55], 'city0': ['Malibu','Sydney','NYC','Malibu','Sydney'], 'city1': ['NYC','Dublin','Malibu','NYC','Dublin']})
new = data.sort_values(by=['city0', 'city1'])
new['w_mean'] = new.apply(lambda row: row.pop0 / row.pop1, axis=1)
print(new)
【问题讨论】:
-
如何确定哪个城市是city0,哪个是city1?例如,如果悉尼和都柏林交换位置,则 w_mean 将为 8.846。
-
确实如此。另一种可能性是将相同城市对的值相加并插入两个新列(sum_pop0 和 sum_pop1)
标签: python pandas dataframe sorting split-apply-combine