Группировка данных по путям во вложенном файле - PullRequest
0 голосов
/ 25 января 2019

Группировка DataFrame поддерживает группирование по спискам столбцов в таблице, например, с учетом:

from pandas import DataFrame as DF

data2 = [{'a':{'x':1,'y':2},'b':2, 'x0':1},{'a':{'x':3,'y':4},'b':4, 'x0':3},{'a':{'x':1,'y':6},'b':6, 'x0':1}]

(для иллюстрации обратите внимание, что столбец «x0» дублирует «x» во вложенном dict)

Работает как задумано:

DF(data2).groupby(['x0','b']).size().unstack()

enter image description here

Как эмулировать это поведение, подставляя вложенный 'x' вместо 'x0'?

Я пробовал подход, использующий lambda для вывода кортежа:

DF(data2).groupby(lambda i: (data2[i]['a']['x'],data2[i]['b'])).size()

(1, 2)    1
(1, 6)    1
(3, 4)    1
dtype: int64

, где data2[i]['x0'] также работает как первый элемент кортежа. В обоих случаях unstack бросков:

AttributeError: 'Index' object has no attribute 'remove_unused_levels'

Таким образом, имена столбцов / ключей не обрабатываются должным образом. Есть ли обходной путь на месте, то есть без установки новых переменных или DataFrames?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Полагаю, если вы хотите использовать lambda expression, вы можете, но это не будет быстрее, чем ваш первый подход:

df = pd.DataFrame(data2).groupby(lambda i: (data2[i]['a']['x'],data2[i]['b'])).size()

# create a multiindex which will allow yo to use unstack
df.index = pd.MultiIndex.from_tuples(df.index, names=['x0', 'b'])
df.unstack(level=1)

b    2   4   6
x0          
1   1.0 NaN 1.0
3   NaN 1.0 NaN
0 голосов
/ 25 января 2019

Используйте pd.DataFrame.from_dict ():

import pandas as pd

data2 = [
    {'a':{'x':1,'y':2},'b':2, 'x':1},
    {'a':{'x':3,'y':4},'b':4, 'x':3},
    {'a':{'x':1,'y':6},'b':6, 'x':1}
]

df = pd.DataFrame.from_dict(data2)
df = df.groupby(['x','b']).size().unstack()
print(df)

выход

b    2    4    6
x
1  1.0  NaN  1.0
3  NaN  1.0  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...