Панды, поворачивающиеся более чем на один столбец в индексе - PullRequest
2 голосов
/ 16 марта 2019

У меня есть датафрейм:

In [1]: import pandas as pd 
   ...:  
   ...: df = pd.DataFrame([['dicts', 'oui_lookup', 'MergeTree', 'ipdr1']], colum
   ...: ns=['database', 'table', 'engine', 'server']) 
   ...: df                                                                      
Out[1]: 
  database       table     engine server
0    dicts  oui_lookup  MergeTree  ipdr1

Я хотел бы повернуть фрейм данных, чтобы изменить его формат.

In [3]: df.pivot(index='table', columns='server', values='engine')              
Out[3]: 
server          ipdr1
table                
oui_lookup  MergeTree

Пока все хорошо. Теперь я хотел бы также иметь в базе данных индекса, я попробовал:

In [4]: df.pivot(index=['database', 'table'], columns='server', values='engine')
   ...:                                                                         
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-c81911288ca4> in <module>
----> 1 df.pivot(index=['database', 'table'], columns='server', values='engine')

/usr/lib/python3.7/site-packages/pandas/core/frame.py in pivot(self, index, columns, values)
   5635     def pivot(self, index=None, columns=None, values=None):
   5636         from pandas.core.reshape.pivot import pivot
-> 5637         return pivot(self, index=index, columns=columns, values=values)
   5638 
   5639     _shared_docs['pivot_table'] = """

/usr/lib/python3.7/site-packages/pandas/core/reshape/pivot.py in pivot(data, index, columns, values)
    385         else:
    386             indexed = data._constructor_sliced(data[values].values,
--> 387                                                index=index)
    388     return indexed.unstack(columns)
    389 

/usr/lib/python3.7/site-packages/pandas/core/series.py in __init__(self, data, index, dtype, name, copy, fastpath)
    247                             'Length of passed values is {val}, '
    248                             'index implies {ind}'
--> 249                             .format(val=len(data), ind=len(index)))
    250                 except TypeError:
    251                     pass

ValueError: Length of passed values is 1, index implies 2

Но я получил эту ошибку. Что мне нужно, это датафрейм в этой форме:

Out[16]: 
                         ipdr1
database table                
dicts    oui_lookup  MergeTree

Что я делаю не так?

1 Ответ

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

Используйте pivot альтернативно с DataFrame.set_index и Series.unstack:

df1 = df.set_index(['database', 'table','server'])['engine'].unstack()
print (df1)
server                   ipdr1
database table                
dicts    oui_lookup  MergeTree
...