Создать столбцы на основе уникальных значений столбцов и заполнить - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий фрейм данных:

    Timestamp   id  lat         long
0   665047      a   30.508420   -84.372882
1   665047      b   30.491882   -84.372938
2   2058714     b   30.492026   -84.372938
3   665348      a   30.508420   -84.372882
4   2055292     b   30.491899   -84.372938

Мой желаемый результат должен иметь:

    Timestamp                        a                       b     
0   665047     [30.508420,  -84.372882] [30.491882, -84.372938]
1   665348     [30.508420,  -84.372882]                    NaN
2   2055292                        NaN  [30.491899, -84.372938]
3   2058714                        NaN  [30.492026, -84.372938]

Где уникальные значения, найденные в df.id, становятся заголовками столбцов (могут бытьнесколько тысяч из них), с широтой и долготой в качестве значений.

Ближайшее, что я пришел, использует:

for i, r in df.iterrows():
    dct[r.Timestamp].append([r.id, r.lat, r.long])

pd.DataFrame.from_dict(dct, orient='index')


                                0                                   1
2055292 [b, 30.491899, -84.372938]                               None
2058714 [b, 30.492026, -84.372938]                               None
665348  [a, 30.50842, -84.37288199999999]                        None
665047  [a, 30.50842, -84.37288199999999]   [b, 30.491882, -84.372938]

Но я знаю, что использование любого вида итерации плохо для панд (и это далеко не соответствует моему желаемому результату), и я уверен, что есть гораздо более простой способ.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Опция 1

Затем установите индекс pipe

df.set_index(['Timestamp', 'id']).pipe(
    lambda d: pd.Series(d.values.tolist(), d.index).unstack()
)

id                                      a                        b
Timestamp                                                         
665047     [30.50842, -84.37288199999999]  [30.491882, -84.372938]
665348     [30.50842, -84.37288199999999]                     None
2055292                              None  [30.491899, -84.372938]
2058714                              None  [30.492026, -84.372938]

Опция 2

cols = ['Timestamp', 'id', 'lat', 'long']
pd.Series({
    t[:2]: list(t[2:])
    for t in df[cols].itertuples(index=False)
}).unstack()

                                      a                        b
665047   [30.50842, -84.37288199999999]  [30.491882, -84.372938]
665348   [30.50842, -84.37288199999999]                     None
2055292                            None  [30.491899, -84.372938]
2058714                            None  [30.492026, -84.372938]
0 голосов
/ 16 мая 2018

Я думаю, что это происходит с unstack:

(df.groupby(['Timestamp', 'id'])
 .apply(lambda x: x[['lat', 'long']].values.flatten())
 .unstack(level='id'))

id                              a                        b
Timestamp                                                 
665047     [30.50842, -84.372882]  [30.491882, -84.372938]
665348     [30.50842, -84.372882]                     None
2055292                      None  [30.491899, -84.372938]
2058714                      None  [30.492026, -84.372938]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...