Если дублированных троек нет *, значения 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