Объедините строки фреймов данных, чтобы исключить NAN

#python #pandas #dataframe #datetime #nan

Вопрос:

У меня есть фрейм данных, созданный из регистратора данных, где каждая точка данных имеет свою собственную метку времени, которая выглядит следующим образом:

 df_orig = pd.DataFrame(
    {
        "val1": [ 1, np.nan, np.nan, 11, np.nan, np.nan, 21, np.nan, np.nan, ],
        "val2": [ np.nan, 2, np.nan, np.nan, 12, np.nan, np.nan, 22, np.nan, ],
        "val3": [ np.nan, np.nan, 3, np.nan, np.nan, 13, np.nan, np.nan, 23, ],
    },
    index=pd.to_datetime( [
        "2021-01-01 00:00", "2021-01-01 00:00:01", "2021-01-01 00:00:02",
        "2021-01-01 00:01", "2021-01-01 00:01:01", "2021-01-01 00:01:02",
        "2021-01-01 00:02", "2021-01-01 00:02:01", "2021-01-01 00:02:02",
    ] )
)
 
                      val1  val2  val3
2021-01-01 00:00:00   1.0   NaN   NaN
2021-01-01 00:00:01   NaN   2.0   NaN
2021-01-01 00:00:02   NaN   NaN   3.0
2021-01-01 00:01:00  11.0   NaN   NaN
2021-01-01 00:01:01   NaN  12.0   NaN
2021-01-01 00:01:02   NaN   NaN  13.0
2021-01-01 00:02:00  21.0   NaN   NaN
2021-01-01 00:02:01   NaN  22.0   NaN
2021-01-01 00:02:02   NaN   NaN  23.0
 

На самом деле мне не нужна точность того, когда была зарегистрирована каждая отдельная точка данных. Я хотел бы уплотнить фрейм данных, исключив NaN буквы s и объединив строки, которые находятся очень близко друг к другу. результат должен выглядеть так:

                      val1  val2  val3
2021-01-01 00:00:00     1     2     3
2021-01-01 00:01:00    11    12    13
2021-01-01 00:02:00    21    22    23
 

Есть ли способ сделать это?

Ответ №1:

По возможности упростите решение для повторной выборки за минуты с max min first помощью или или:

 df = df_orig.resample('Min').max()
print (df)
                     val1  val2  val3
2021-01-01 00:00:00   1.0   2.0   3.0
2021-01-01 00:01:00  11.0  12.0  13.0
2021-01-01 00:02:00  21.0  22.0  23.0
 

Комментарии:

1. Спасибо. В моем реальном кадре данных не было такой хорошей частоты между данными, так что повторная выборка привела ко многим-многим строкам, заполненным NaN буквами s. Я решил эту проблему, используя эту строку: data = data_orig.resample( "100ms" ).first().dropna( how="all" ) .