【问题标题】:How to create new columns using groupby based on logical expressions如何基于逻辑表达式使用 groupby 创建新列
【发布时间】:2020-08-27 10:33:39
【问题描述】:

我有这个 CSV 文件

http://www.sharecsv.com/s/2503dd7fb735a773b8edfc968c6ae906/whatt2.csv

我想创建三列,“MT_Value”、“M_Value”和“T_Data”,它们具有按年和月分组的数据的平均值,这是我通过这样做完成的。

data.groupby(['Year','Month']).mean()

但是对于 M_value 我只需要对不同于零的值求平均值,而对于 T_Data 我需要将零值的计数除以值的总数,我想对于最后一个我需要将零值的数量除以分组的总数据量,但老实说,我有点迷茫。我在google上看了,他们说了一些关于transform的东西,但我不太了解

谢谢。

【问题讨论】:

  • ... 对于 T_Data 我需要所有零值除以值的总数,不是0吗?
  • 嗨,我很难解释,但我的意思是数据计数为零除以总计数。

标签: pandas csv pandas-groupby


【解决方案1】:

你可以这样做:

(data.assign(M_Value=data.Valor.where(data.Valor!=0),
            T_Data=data.Valor.eq(0))
     .groupby(['Year','Month'])
     [['Valor','M_Value','T_Data']]
     .mean()
)

解释:assign 将创建具有各自名称的新列。现在

  1. data.Valor.where(data.Valor!=0) 将用nan 替换0 值,当我们调用mean() 时将被忽略。
  2. data.Valor.eq(0) 将用1 替换0,用0 替换其他值。所以当你做mean()时,你计算count(Valor==0)/total_count()

输出:

                Valor    M_Value    T_Data
Year Month                                
1970 1       2.306452   6.500000  0.645161
     2       1.507143   4.688889  0.678571
     3       2.064516   7.111111  0.709677
     4      11.816667  13.634615  0.133333
     5       7.974194  11.236364  0.290323
...               ...        ...       ...
1997 10      3.745161   7.740000  0.516129
     11     11.626667  21.800000  0.466667
     12      0.564516   4.375000  0.870968
1998 1       2.000000  15.500000  0.870968
     2       1.545455   5.666667  0.727273

[331 rows x 3 columns]

【讨论】:

  • 如果我也想添加,假设“Valor”的最大值和最小值是否需要使用.agg()?再次感谢您,我真的是编程新手,Pandas 真的让我很难受。
  • 是的,agg 是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2016-02-14
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多