【问题标题】:Pandas column sum base on rowPandas 基于行的列总和
【发布时间】:2019-03-02 17:20:27
【问题描述】:

我有一个数据框:

      year  month  day  highest_temp
0      1961      1    1           7.9
1      1961      1    2           9.2
2      1961      1    3           7.3
3      1961      1    4          11.5
4      1961      1    5           7.7
5      1961      1    6           8.6
6      1961      1    7           9.1
7      1961      1    8          11.8
8      1961      1    9           6.9

我想对从 2 月 1 日到该数据框所有年份的总和 >= 600 的最高温度列求和。我试过 iterrows(), sum() 但我没有得到我想要的结果。感谢您的帮助

编辑: 根据@bubble 的回答,我得到了以下结果:

57   1961      2   27          11.6     273.2
58   1961      2   28          11.7     284.9
59   1961      3    1          15.3     300.2
60   1961      3    2          18.9     319.1
..    ...    ...  ...           ...       ...
81   1961      3   23          15.5     584.3
82   1961      3   24          13.0     597.3

但是我仍然希望该值超过 600 的阈值。例如:在上面的结果中,我希望最终值再加上一行。 这是我基于@bubble 的代码:

value = 600            
df2=df2.drop(df2[df2.month<2].index)

cumsums = df2.groupby(['year']).transform('cumsum')['highest_temp']


df2.loc[cumsums < value, 'cumsum_t'] = cumsums[cumsums < value]

result = df2.loc[cumsums < value, :]

【问题讨论】:

  • 请附上您的代码。
  • 查看cumsum

标签: python pandas


【解决方案1】:
df.loc[df.highest_temp.cumsum()<600,:]

这会通过条件“hightest_temp 的总和小于 600”来选择子数据帧。您可以再次申请 cumsum,例如

data = df.loc[df.highest_temp.cumsum()<600, :]
data.loc[:, 'cumsum_t'] = data.highest_temp.cumsum() 

另外,您可以使用groupby 方法重置每个月的cumsum:

value = 600                                                                       
cumsums = df.groupby(['month']).transform('cumsum')['highest_temp']                 
df.loc[cumsums < value, 'cumsum_t'] = cumsums[cumsums < value]                        
result = df.loc[cumsums < value, :]

【讨论】:

  • 感谢您的回答,它真的很有帮助。但是,我需要从月份列 = 2 开始总和,直到总和超过 600,并且我希望在数据框中的所有年份都这样做。你有什么建议吗?
猜你喜欢
  • 2019-10-15
  • 1970-01-01
  • 2019-11-11
  • 2014-08-02
  • 1970-01-01
  • 2022-11-12
  • 2022-11-30
  • 2017-02-17
  • 1970-01-01
相关资源
最近更新 更多