【问题标题】:How to keep the row after filtering out?过滤掉后如何保留行?
【发布时间】:2022-01-23 03:03:25
【问题描述】:

我的步骤是这样的,我会先过滤dataframe,然后groupby得到我想要的数据集。比如我的df是这样的:

test = pd.DataFrame([["Mon", 3, "A"], ["Tue", 6, "A"], ["Tue", 4, "A"], ["Wed", pd.np.nan, "A"], ["Thu", 9, "A"], ["Fri", 1, "A"], ["Sat", 2, "A"], ["Sun", 3, "B"]], columns=["date", "value", "class"])

数据框“测试”如下所示:

        date  value  Class
0        Mon    3     A
1        Tue    6     A
2        Tue    4     A
3        Wed    0     A
4        Thu    9     A
5        Fri    1     A
6        Sat    2     A
7        Sun    3     B

我将首先通过test = test[test["class"] == "A"]过滤所有A 然后我会通过new_df = test(["date"],dropna=False)["value"].sum()聚合

因为如您所见,周日将在第一步中被过滤掉。上述聚合后的结果数据帧中将没有星期日。但最终的数据集需要保持周日。

按“日期”分组后,我的目标是这样的。

        date  value 
0        Mon    3    
1        Tue    10    
2        Wed    0    
3        Thu    9     
4        Fri    1     
5        Sat    2     
6        Sun    0  

这只是一个简化版本。我的实际情况是,“数据”列实际上是一个日期列,例如 1-Jan-2021。数据集长达几年。但是过滤会在第一步中过滤掉一些日期(如上面的示例,过滤后星期天就消失了)。但是,我希望那些年份的所有日期都在我的结果数据框中。我怎样才能实现它?

【问题讨论】:

  • 你说test(["date"],dropna=False) 但是,你不是说test 之后的sum 函数吗?例如test.XXX(["date"],dropna=FALSE)

标签: python pandas datetime pandas-groupby filtering


【解决方案1】:

先设置你不想保持为0的值怎么样

test.loc[test['class']!='A', 'value'] = 0
test.groupby('date')['value'].sum()
date
Fri     1.0
Mon     3.0
Sat     2.0
Sun     0.0
Thu     9.0
Tue    10.0
Wed     0.0

【讨论】:

  • 但是出现了一个新问题,在将那些我不想归零后,当我使用 mean() 函数进行 groupby 时,数字不正确。 sum() 是正确的。是不是默认情况下,mean() 函数包含所有的零?
  • 是的,平均值肯定包括所有 0。要使平均值起作用,您可以将它们设置为 np.nan
  • 谢谢李!是的,我明白了
  • 正确。注意这会在聚合后给出 np.nan 的结果,因此您需要稍后用 0 填充它们 .fillna(0)
  • 像魅力一样工作!
猜你喜欢
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多