Изменять форму данных панд, чтобы отразить неявный x-valus? - PullRequest
2 голосов
/ 17 марта 2019

как я могу изменить форму кадра данных, где подмножество столбцов являются значениями y для определенных значений x?

df_record = pd.DataFrame({
    'date' : ['2019-03-17', '2019-03-17', '2019-03-17', '2019-03-17'],
    'id' : ['a', 'a', 'b', 'b'],
    'meta' : ['A', 'B', 'A', 'B'],
    'y11' : [0.1, 0.2, 0.3, 0.4],
    'y12' : [1, 2, 3, 4],
    'y21' : [10, 20, 30, 40],
    'y22' : [100, 200, 300, 400],
    })

В этом примере y12, y12, y21 и y22 соответствуют, например, [10,20,100,200].Я могу добавить это к каждой строке:

xs = [10,20,100,200]
df_ = pd.DataFrame()
for i in range(len(df_record)):
    xs_ = pd.Series(xs, name=i)
    df_ = pd.concat([df_, xs_], axis=1)
df_['xs'] =  [ 'x%i'%i for i in xs ]    
pd_ = pd.concat([df_record, df_.set_index('xs').T], axis=1)

Что печатает:

         date id meta  y11  y12  y21  y22  x10  x20  x100  x200
0  2019-03-17  a    A  0.1    1   10  100   10   20   100   200
1  2019-03-17  a    B  0.2    2   20  200   10   20   100   200
2  2019-03-17  b    A  0.3    3   30  300   10   20   100   200
3  2019-03-17  b    B  0.4    4   40  400   10   20   100   200

Но теперь я потерялся.Я почти уверен, что что-то вроде df_.pivot() должно помочь мне отразить структуру, то есть xs - это индексный уровень, подобный ['date', 'id', 'meta', 'xs'].

Заранее спасибо!

PS.Как я могу опубликовать результаты вышеуказанных команд с Jupyter NB?

1 Ответ

1 голос
/ 17 марта 2019

Вы можете создать новый DataFrame с указанными значениями индекса и столбцов и DataFrame.join до оригинала:

xs = [10,20,100,200]
cols = [f'x{x}' for x in xs]
df = df_record.join(pd.DataFrame([xs], index=df_record.index, columns=cols))
print (df)
         date id meta  y11  y12  y21  y22  x10  x20  x100  x200
0  2019-03-17  a    A  0.1    1   10  100   10   20   100   200
1  2019-03-17  a    B  0.2    2   20  200   10   20   100   200
2  2019-03-17  b    A  0.3    3   30  300   10   20   100   200
3  2019-03-17  b    B  0.4    4   40  400   10   20   100   200

А затем измените на DataFrame.melt:

df1 = df.melt(['id', 'date', 'meta'], value_name='xs')
print (df1.head())
  id        date meta variable   xs
0  a  2019-03-17    A      y11  0.1
1  a  2019-03-17    B      y11  0.2
2  b  2019-03-17    A      y11  0.3
3  b  2019-03-17    B      y11  0.4
4  a  2019-03-17    A      y12  1.0

При необходимости удалить столбец variable:

df1 = df1.drop('variable',axis=1)
print (df1.head())
  id        date meta   xs
0  a  2019-03-17    A  0.1
1  a  2019-03-17    B  0.2
2  b  2019-03-17    A  0.3
3  b  2019-03-17    B  0.4
4  a  2019-03-17    A  1.0

EDIT:

Для уточнения столбцов возможно использование:

df - pd.melt(df_concat, 
             id_vars=['id', 'date', 'meta'], 
             value_vars=['y11', 'y12', 'y21', 'y22'], 
             var_name='ys',
             value_name='xs')
...