pandas группа фреймов данных с условием - PullRequest
1 голос
/ 07 августа 2020

У меня есть 3D-фрейм данных с x и y и временем как 3-м измерением. Данные представляют собой 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 (), но не знаю, как реализовать это в моем наборе данных.

Заранее спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Вот неуклюжий способ сделать это:

# Get the modes per group and count how often they occur
df_modes = df.groupby(["x", "y"]).agg(
    {
        'classif': [lambda x: pd.Series.mode(x)[0], 
                    lambda x: sum(x == pd.Series.mode(x)[0])]
    }
).reset_index()
# Rename the columns to something a bit more readable
df_modes.columns = ["x", "y", "classif_mode", "classif_mode_freq"]
# Discard modes whose frequency was less than 3
df_modes.loc[df_modes["classif_mode_freq"] < 3, "classif_mode"] = np.nan

Теперь df_modes.drop("classif_mode_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
...