Как объединить два кадра данных Pandas на основе значения в одной строке и с разными именами столбцов? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть два кадра данных панд, которые я хочу объединить.Фреймы данных имеют разные размеры, поэтому я хочу сохранить только те, которые появляются в df1 - некоторые студенты появляются только в одном из df1 или df2.

df1 с заголовками ['student', 'week1_count', 'week1_mean', ..., 'week11_count', 'week11_mean'] и инициализируется со всеми ячейками, кроме столбца 'student', равными нулю.

df2 имеет заголовки ['student', 'week', 'count', 'mean'] и заполняется соответствующим 'student'.'week' - это int между 1-11, а 'count' и 'mean' - соответствующие числа с плавающей точкой.

Что я хочу сделать, это для данного учащегося в df1 и df2, длядля данной недели возьмите соответствующее значение 'count' и 'mean' и поместите его в df1 в соответствующем столбце.Например, значение 'week' 1 будет означать, что значение в 'count' и 'mean' в df2 будет помещено в 'week1_count' и 'week1_mean' соответственно в df1.

Относительно недель, которые я просматривал range(11) и создавал подмножество фрейма данных, но задаюсь вопросом, есть ли более быстрый путь.

то есть

df1:
    student week1_count week1_mean week2_count week2_mean ... 
      '0'        0           0          0            0    ...
      '2'        0           0          0            0    ...
      '3'        0           0          0            0    ...
      .
      .
      .
      '500'      0           0          0            0    ...
      '541'      0           0          0            0    ...
      '542'      0           0          0            0    ... 

и

df2:
    student week count mean
      '0'     1    5    6.5
      '1'     1    3    7.0
      '2'     1    2    8.2
      '2'     2    10   15.1
      .
      .
      .
     '500'    2    12   4.3
     '540'    4    1    3.0
     '542'    1    4    1.2
     '542'    2    9    5.2

таким образом, ожидаемый результат

df_result:
    student week1_count week1_mean week2_count week2_mean ... 
      '0'        5           6.5        0            0    ...
      '2'        2           8.2        10           15.1 ...
      '7'        0           0          0            0    ...
      .
      .
      .
      '500'      0           0          12           4.3  ...
      '541'      0           0          0            0    ...
      '542'      4           1.2        9            5.2  ... 

Я пробовал различные процедуры - ни одна из которых не работала, как предполагалось - в пандах, таких как:

  • объединение: используя 'leftПрисоединяйтесь, как я хочу формат df1.Я попытался переименовать столбцы в df2, чтобы они соответствовали именам столбцов.
  • join
  • concat
  • update: попытался инициализировать все ячейки в df1 в np.nan вместо0.0, а затем используйте df1.update(df2) (после переименования столбцов в df2), чтобы обновить все значения nan с помощью требуемого значения.
  • попытался просто установить значения: то есть что-то вроде df1[rows_in_both][['week1_count','week1_mean']] = df2[rows_in_both][['count','mean']], но это нелибо не работает

1 Ответ

0 голосов
/ 28 декабря 2018

Это больше похоже на update проблему , а не merge

s=df2.pivot(index='student',columns='week',values=['count','mean'])# pivot df2 to format it to df1 like . 
s.columns.map('week{0[1]}_{0[0]}'.format) # modify the column
Out[645]: 
Index(['week1_count', 'week2_count', 'week4_count', 'week1_mean', 'week2_mean',
       'week4_mean'],
      dtype='object')
s.columns=s.columns.map('week{0[1]}_{0[0]}'.format) 

Тогда мы делаем update

df1=df1.set_index('student')
df1=df1.update(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...