【问题标题】:pandas iterate over rows based on column valuespandas 根据列值迭代行
【发布时间】:2020-12-22 03:54:46
【问题描述】:

我想同时计算两个城市之间的温差。数据结构如下:

dic = {'city':['a','a','a','a','a','b','b','b','b','b'],'week':[1,2,3,4,5,3,4,5,6,7],'temp':[20,21,23,21,25,20,21,24,21,22]}
df = pd.DataFrame(dic)
df
+------+------+------+
| city | week | temp |
+------+------+------+
| a    |    1 |   20 |
| a    |    2 |   21 |
| a    |    3 |   23 |
| a    |    4 |   21 |
| a    |    5 |   25 |
| b    |    3 |   20 |
| b    |    4 |   21 |
| b    |    5 |   24 |
| b    |    6 |   21 |
| b    |    7 |   22 |
+------+------+------+

我想计算 a 和 b 城市在第 3 周、第 4 周和第 5 周的温差。最终的数据结构应该如下所示:

+--------+-------+------+------+
| city_1 | city2 | week | diff |
+--------+-------+------+------+
| a      | b     |    3 |    3 |
| a      | b     |    4 |    0 |
| a      | b     |    5 |    1 |
+--------+-------+------+------+

【问题讨论】:

    标签: pandas loops


    【解决方案1】:

    我会旋转您的数据,删除 NA 值,然后直接进行减法。这样您就可以保持与每个城市相关联的源温度。

    result = (
        df.pivot(index='week', columns='city', values='temp')
          .dropna(how='any', axis='index')
          .assign(diff=lambda df: df['a'] - df['b'])  
    )
    print(result)
    
    city     a     b  diff
    week                  
    3     23.0  20.0   3.0
    4     21.0  21.0   0.0
    5     25.0  24.0   1.0
    

    【讨论】:

    • 只是对你的答案的一个游戏:( df.pivot(index='week', columns='city', values='temp') .dropna(how='any', axis='index') .assign(diff=lambda df : df.agg(np.subtract.reduce, axis=1)) )
    • @sammywemmy 如果你的版本也有“C”城市会怎样?
    • 它也应用它。它的构建与 functools 中的 reduce 相同。因此,您将拥有 df.a - df.b - df.c,因为它正在跨列应用它
    • @sammywemmy 所以可能不是比较城市温度的​​好操作
    • 这个问题不是比较温度,是吗?据我了解,它正在获得温度差异。减少与比较无关
    猜你喜欢
    • 2019-02-27
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多