Изменить форму данных для всех значений в столбце - PullRequest
1 голос
/ 21 января 2020

У меня есть такой фрейм данных:

number   type     X     Y           Z              
  1       red     101   NaN         101,NaN          
  2       blue    101   40,50       101,40,50
  3       green   401   70,NaN      101,70,NaN

Есть ли способ пометить каждый элемент type на основе столбца Z? Z это просто комбинированная версия X и Y.

Так что-то вроде:

 Number    Type         Z     X_or_Y
  1        red        101     X
  1        red        NaN     Y
  2        blue       101     X
  2        blue       40      Y
  2        blue       50      Y
  3        green      101     X
  3        green      70      Y
  3        green      NaN     Y

Я думаю о функции плавления, но не знаю, как.

reshaped_data = pd.melt(df, id_vars =['number', 'type',
                           'Z'], value_vars =['X', 'Y'])

** Редактировать: ** Значения в столбце X_or_Y должны исходить из столбцов X и Y в исходном кадре данных

1 Ответ

2 голосов
/ 21 января 2020

Решение для pandas до 0,24+ сначала с DataFrame.melt, затем Series.str.split и DataFrame.stack для разбитых разделенных значений на ,:

df1 = df.melt(id_vars =['number', 'type'], value_vars =['X', 'Y'], var_name='Flag')

s = (df1.pop('value').astype(str).str.split(',', expand=True)
       .stack()
       .reset_index(level=1, drop=True)
       .rename('Z'))
df1 = df1.join(s).sort_values('number').reset_index(drop=True)

print (df1)
   number   type Flag    Z
0       1    red    X  101
1       1    red    Y  nan
2       2   blue    X  101
3       2   blue    Y   40
4       2   blue    Y   50
5       3  green    X  401
6       3  green    Y   70
7       3  green    Y  NaN

Решение выше pandas 0,24 с DataFrame.explode:

df1 = df.melt(id_vars =['number', 'type'], value_vars =['X', 'Y'], var_name='Flag')

df1 = (df1.assign(value = df1['value'].astype(str).str.split(','))
         .explode('value')
         .sort_values('number')
         .reset_index(drop=True))

print (df1)
   number   type Flag value
0       1    red    X   101
1       1    red    Y   nan
2       2   blue    X   101
3       2   blue    Y    40
4       2   blue    Y    50
5       3  green    X   401
6       3  green    Y    70
7       3  green    Y   NaN
...