создание нового фрейма данных путем объединения разных групп - PullRequest
1 голос
/ 29 апреля 2020
          id      source                 Date       CVI
67092  10365     sat     2016-11-20 00:00:00      1.9
67093  10365     nel-2   2016-11-20 00:00:00      1.5
67094  10365     sat     2016-12-06 00:00:00   1.436964
67095  10365     sat     2016-12-22 00:00:00        NaN
67096  10365     sat     2017-01-07 00:00:00   4.835949
67097  10365     sat     2017-01-23 00:00:00  10.033607
...      ...         ...                  ...        ...
723    84650  nel-2      2020-04-03 00:00:00   5.085851
724    84650  nel-2      2020-04-08 00:00:00   4.375207
725    84650  nel-2      2020-04-13 00:00:00   0.040688
726    84650  nel-2      2020-04-18 00:00:00   3.151000

Из приведенного выше кадра данных я хотел бы создать новый кадр данных, в котором id для одного и того же Date и разных source находятся в одной строке. Например, вывод должен выглядеть следующим образом:

         id              Date                 sat_CVI   nel-2_CVI
0       10365        2016-11-20 00:00:00        1.9        1.5

Я пытался использовать groupby, но он не выполняет то, что я хочу. Обратите внимание, что в результирующей таблице есть только те строки, в которых один и тот же id имеет значение CVI для одного и того же Date для обоих source

1 Ответ

1 голос
/ 29 апреля 2020

Если дублированных троек нет *, значения id, Date и source используют DataFrame.set_index с Series.unstack для изменения формы, а затем изменяют имена столбцов на DataFrame.add_suffix с удалением строк с пропущенными значениями по DataFrame.dropna:

df1 = (df.set_index(['id','Date','source'])['CVI']
         .unstack()
         .add_suffix('_CVI')
         .dropna()
         .reset_index()
         .rename_axis(None, axis=1))
print (df1)
      id                 Date  nel-2_CVI  sat_CVI
0  10365  2016-11-20 00:00:00        1.5      1.9

Если возможны дубликаты, необходимо выполнить первый отказ решения DataFrame.pivot_table (он также работает без дублирующихся троек, а затем без агрегации) с некоторой совокупной функцией, такой как sum, mean вместо set_index с unstack:

print (df)
          id source                 Date        CVI
67092  10365    sat  2016-11-20 00:00:00   1.900000 <- duplicated triple
67092  10365    sat  2016-11-20 00:00:00   1.000000 <- duplicated triple
67093  10365  nel-2  2016-11-20 00:00:00   1.500000
67094  10365    sat  2016-12-06 00:00:00   1.436964
67095  10365    sat  2016-12-22 00:00:00        NaN
67096  10365    sat  2017-01-07 00:00:00   4.835949
67097  10365    sat  2017-01-23 00:00:00  10.033607
723    84650  nel-2  2020-04-03 00:00:00   5.085851
724    84650  nel-2  2020-04-08 00:00:00   4.375207
725    84650  nel-2  2020-04-13 00:00:00   0.040688
726    84650  nel-2  2020-04-18 00:00:00   3.151000

df1 = (df.pivot_table(index=['id','Date'],columns='source', values='CVI', aggfunc='sum')
         .add_suffix('_CVI')
         .dropna()
         .reset_index()
         .rename_axis(None, axis=1))
print (df1)
      id                 Date  nel-2_CVI  sat_CVI
0  10365  2016-11-20 00:00:00        1.5      2.9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...