2015-07-24 2 views
0

Я прочитал несколько разных способов присоединения и до сих пор не нашел решения, на которых я могу окутать голову. Был надеется на какой-то ввод или руководство.Pandas Groupby Row с несколькими столбцами

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

In [1]: df_old 
Out[1]: 
CID  time_a  time_b  time_c  time_d 
dc12 4:14pm  NaN  NaN  NaN 
dc12 NaN  4:18pm  NaN  NaN 
dc12 NaN  NaN  4:44pm  NaN 
ab14 2:14pm  NaN  NaN  NaN 
ab14 NaN  3:18pm  NaN  NaN 
ab14 NaN  NaN  3:27pm  NaN 
ab14 NaN  NaN  NaN  4:15pm 

То, что я хочу, было бы следующее:

In [2]: df_new 
Out[2]: 

CID  time_a  time_b  time_c  time_d 
dc12 4:14pm  4:18pm  4:44pm  NaN 
ab14 2:14pm  3:18pm  3:27pm  4:15pm 
... 

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

Заранее благодарим за помощь!

+0

Мы знаем, что для каждого идентификатора CID имеется не более одного значения, отличного от NaN, для каждого столбца? – DSM

+0

Нет, к сожалению, мы этого не делаем. У некоторых есть только время a и время b, у некоторых есть только время a, время b и время c, у некоторых есть все. Если у вас есть время d, у вас всегда есть время, хотя (иерархическое). – mburke05

+0

Мой вопрос идет в другую сторону. Могли бы вы иметь две значения non-nan (например, 16:14 и 17:12) для time_a и CID = dc12? Или всегда есть только нуль или один раз, когда мы выбираем столбец и CID? – DSM

ответ

2

Вы можете использовать groupby и затем вызвать .first(), который даст вам первое значение, не нан видел (и именно поэтому мне было интересно, есть ли только один):

>>> df.groupby("CID", as_index=False).first() 
    CID time_a time_b time_c time_d 
0 ab14 2:14pm 3:18pm 3:27pm 4:15pm 
1 dc12 4:14pm 4:18pm 4:44pm  NaN 
>>> df.groupby("CID", as_index=False, sort=False).first() 
    CID time_a time_b time_c time_d 
0 dc12 4:14pm 4:18pm 4:44pm  NaN 
1 ab14 2:14pm 3:18pm 3:27pm 4:15pm 

Это предполагает ИДС является столбец, а не индекс. Если это индекс, либо вызовите reset_index, либо используйте вместо него df.groupby(level=0).first().

Смежные вопросы