Объединение двух столбцов из двух фреймов данных; одинаковые индексы, но разная длина

Обратите внимание, я начинающий программист и начинающий пользователь python/pandas. Я ученый-бихевиорист и учусь использовать панд для обработки и организации своих данных. В результате некоторые из этих вопросов могут показаться совершенно очевидными и не достойными обсуждения на форуме. Пожалуйста, проявите терпимость! Для меня это дни работы, и я действительно потратил часы, пытаясь найти ответ на этот вопрос. Заранее благодарю за любую помощь.

Мои данные выглядят так. «Настоящие» данные субъекта и получателя всегда представляют собой 5-значные числа, а данные «поведения» всегда представляют собой буквенные коды. Моя проблема в том, что я также использую этот формат для специальных строк, обозначенных маркерами, такими как «дата» или «s» в столбце «Актер». Эти маркеры указывают, что столбец «Поведение» содержит этот особый тип данных, а не фактические данные о поведении. Итак, я хочу заменить маркеры в столбце «Актер» значениями NaN и получить специальные данные из столбца «Поведение», чтобы поместить их в другой столбец (в этом примере — пустой столбец «Активность»).

    follow    Activity    Actor    Behavior    Recipient1
0   1         NaN         date     2.1.3.2012  NaN
1   1         NaN         s        ss.hx       NaN
2   1         NaN         50505    vo          51608
3   1         NaN         51608    vr          50505
4   1         NaN         s        ss.he       NaN

До сих пор я написал некоторый код в pandas, чтобы выделить строки «s» в новый фрейм данных:

def get_act_line(group):
    return group.ix[(group.Actor == 's')]

result = trimdata.groupby('follow').apply(get_act_line)

Я скопировал столбец «Поведение» в этом фрейме данных в столбец «Активность» и заменил значения «Актер» и «Поведение» на NaN:

result.Activity = result.Behavior
result.Behavior = np.nan
result.Actor = np.nan
result.head()

Итак, мой новый кадр данных выглядит так:

follow         follow    Activity    Actor    Behavior    Recipient1
1        2     1         ss.hx       NaN      NaN         NaN
         34    1         hf.xa       NaN      NaN         f.53702
         74    1         hf.fe       NaN      NaN         NaN
10       1287  10        ss.hf       NaN      NaN         db
         1335  10        fe          NaN      NaN         db

Теперь я хотел бы объединить этот кадр данных с оригиналом, заменив все значения в этих выбранных строках, но сохранив значения для других строк в исходном кадре данных.

Это может показаться простым вопросом с очевидным решением, или, возможно, я с самого начала все сделал неправильно!

Я проработал книгу Уэса МакКинни, я прочитал документацию по различным типам слияний, сопоставлений, соединений, преобразований, конкатенаций и т. д. Я просмотрел форумы и не нашел ответа, который помог бы мне понять это. Ваша помощь будет очень признательна.


person M.A.Kline    schedule 23.09.2013    source источник


Ответы (1)


Один из способов сделать это (хотя могут быть более оптимальные или элегантные способы):

mask = (df['Actor']=='s')
df['Activity'] = df[mask]['Behavior']
df.ix[mask, 'Behavior'] = np.nan 

где df эквивалентен вашему кадру данных результатов. Это должно вернуться (мои порядки столбцов немного отличаются):

  Activity  Actor             Behavior  Recipient1  follow
0      NaN   date  2013-04-01 00:00:00          NaN       1
1    ss.hx    NaN                ss.hx          NaN       1
2      NaN  50505                   vo        51608       1
3      NaN  51608                   vr        50505       1
4    ss.he    NaN                ss.hx          NaN       1

Использованная литература:

  • Объяснение df.ix из другого сообщения STO.
person mlimb    schedule 24.09.2013