Python 带条件的数据帧组

Python 带条件的数据帧组,python,python-3.x,pandas,pandas-groupby,frequency,Python,Python 3.x,Pandas,Pandas Groupby,Frequency,我有一个三维数据框,x和y与时间为三维。 这些数据是在不同时间拍摄的5组卫星图像。 x和y表示每个像素 x y time SIPI classif 7.620001 -77.849990 2018-04-07 1.011107 2.0 2018-10-14 1.023407 2.0 2018-12-28 0.0

我有一个三维数据框,x和y与时间为三维。 这些数据是在不同时间拍摄的5组卫星图像。 x和y表示每个像素

 x        y              time       SIPI       classif
7.620001 -77.849990     2018-04-07  1.011107    2.0
                        2018-10-14  1.023407    2.0
                        2018-12-28  0.045107    3.0
                        2020-01-10  0.351107    2.0
                        2018-06-29  0.351107    2.0
         -77.849899     2018-04-07  1.010777    8.0
                        2018-10-14  0.510562    2.0
                        2018-12-28  1.410766    4.0
                        2020-01-10  1.010666    8.0
                        2018-06-29  2.057068    8.0
         -77.849809     2018-04-07  0.986991    1.0
                        2018-10-14  0.986991    8.0
                        2018-12-28  0.986991    5.0
                        2020-01-10  0.984791    5.0
                        2018-06-29  0.986991    3.0
         -77.849718     2018-04-07  0.975965    10.0
                        2018-10-14  0.964765    7.0
                        2018-12-28  0.975965    10.0
                        2020-01-10  0.975965    10.0
                        2018-06-29  0.975965    3.0
         -77.849627     2018-04-07  1.957747    2.0
                        2018-10-14  0.132445    6.0
                        2018-12-28  0.589677    2.0
                        2020-01-10  1.982445    2.0
                        2018-06-29  3.334456    7.0
我需要对数据进行分组,作为新列,我需要“classif_rf”列中的值,这是5个数据集中最常见的列。这些值是介于1和10之间的整数。我想添加一个条件,只添加高于3的频率

 x          y           classif
7.620001 -77.849990     2.0
         -77.849899     8.0
         -77.849809     Na
         -77.849718     10.0
         -77.849627     2.0
因此,我需要数据帧,其中每个像素有一个最高频率的值,当频率低于3时,应该有一个NA值

pandas.groupby函数可以这样做吗?我考虑过value_counts(),但我不确定如何在我的数据集中实现它


提前谢谢你

以下是一种笨拙的方法:

#获取每个组的模式并计算它们出现的频率
df_modes=df.groupby([“x”,“y”]).agg(
{
'classif':[lambda x:pd.Series.mode(x)[0],
λx:sum(x==pd.Series.mode(x)[0])]
}
).reset_index()
#将列重命名为可读性更强的列
df_modes.columns=[“x”、“y”、“classif_mode”、“classif_mode\u freq”]
#丢弃频率小于3的模式
df_modes.loc[df_modes[“classif_mode_freq”]<3,“classif_mode”]=np.nan
现在
df\u modes.drop(“classif\u mode\u freq”,axis=1)
将返回

          x          y  classif_mode
0  7.620001 -77.849990           2.0
1  7.620001 -77.849899           8.0
2  7.620001 -77.849809           NaN
3  7.620001 -77.849718          10.0
4  7.620001 -77.849627           2.0

这回答了你的问题吗?这是没有频率大于三个条件的:
df.groupby([“x”,“y”])[“classif”].agg(pd.Series.mode)
我尝试过类似的方法,但是如果列“classif”中有5个不同的值,函数如何对像素值进行分类?函数是否取第一个更好的值?什么是“第一个最好的值”?这需要时间。你是在问,如果一组中最频繁的数字出现平局,它会做什么?很抱歉,这让人费解。我是说先到先得的价值。我知道它采用了模式。确切地说,我不确定函数做什么,如果有tie,比如1,2,3,4,7。有没有可能在没有重置索引的情况下实现它?正因为如此,我失去了维度。我的数据框看起来像:我需要这样的东西:。现在我尝试了这个函数:count_cond=df.groupby(['x','y']).agg(lambda x:x.value_counts().index[0]),但我无法在那里应用我的条件。我不确定-但在完成后,您可以始终将lat和lon再次设置为索引