Как я могу работать с сгруппированными массивами из вложенных панд DataFrames? - PullRequest
0 голосов
/ 29 января 2019

У меня есть ряд вложенных панд DataFrames, содержащих несколько (сотни) массивов, и я хотел бы усреднить каждую переменную по разным уровням вложенности.

Переменная mydatadf содержит очень простой репрезентативный пример моих реальных данных.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

mydata = dict()
participant = ['participantA', 'participantB']
for p in participant:
    ses = dict()
    session = ['ses_1', 'ses_2']
    for s in session:
        series = dict()
        set = ['s_1', 's_2', 's_3']
        for se in set:
            reps = dict()
            rep = ['r_1', 'r_2', 'r_3', 'r_4', 'r_5']
            for r in rep:
                vars = dict()
                vars = {'var1': np.sin(np.random.rand(1000)*2),
                        'var2': np.sin(np.random.rand(1000)*2)}
                varsdf = pd.DataFrame(data=vars)
                reps[r] = vars
            series[se] = reps
        ses[s] = series
    mydata[p] = ses
mydatadf = pd.DataFrame(mydata)

Как можно эффективно усреднить (например) var1 по уровням вложенности reps, series, ses и / или participant?

В конце концов, я хотел бы нанести все объекты var1 и выделить осредненные данные различными цветами на любом желаемом уровне вложенности.

for p in mydatadf.keys():
    for ses in mydatadf[p].keys():
        for set in mydatadf[p][ses].keys():
            for rep in mydatadf[p][ses][set].keys():
                data = mydatadf[p][ses][set][rep]['var1']
                plt.plot(data)
plt.show()

1 Ответ

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

Вы всегда можете сгладить фрейм данных и выполнить стандартные групповые операции (я не знаю, является ли он оптимальным, но он работает):

df = pd.io.json.json_normalize(mydata)   #this will give a nested dataframe
df_flat = pd.DataFrame(df.T.index.str.split('.').tolist()).assign(values=df.T.values)


df_flat.head(3)
>>   0      1    2    3     4  \
0  participantA  ses_1  s_1  r_1  var1   
1  participantA  ses_1  s_1  r_1  var2   
2  participantA  ses_1  s_1  r_2  var1   

                                              values  
0  [0.7267196257553268, 0.9822775511169437, 0.991...  
1  [0.6633676714415264, 0.2823588336690545, 0.977...  
2  [0.2211576389168905, 0.9399581790280525, 0.645...  

Редактировать : сгруппировать иприменить функцию (скажем, значит):

# in this case I choose column 4, corresponding to 'var'.
# You can change the name of the column using df_flat.columns.rename
# note that I use np.hstack as you are dealing with a an array of arrays
column = 4   
df_flat.groupby(column)['Values'].apply(lambda x: np.hstack(x).mean())
>> 4
var1    0.707803
var2    0.707821
Name: Values, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...