Python 如何从嵌套数据帧对分组数组进行操作?
我有一系列嵌套的数据帧,其中包含几个(数百个)数组,我想在不同的嵌套级别上平均每个变量 变量Python 如何从嵌套数据帧对分组数组进行操作?,python,pandas,numpy,Python,Pandas,Numpy,我有一系列嵌套的数据帧,其中包含几个(数百个)数组,我想在不同的嵌套级别上平均每个变量 变量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()
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
、系列
、ses
和/或参与者
最后,我想绘制所有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()
您始终可以展平数据帧并执行标准groupby操作(我不知道它是否是最佳的,但它可以工作): 编辑:分组并应用函数(例如,平均值):
保持简单。为什么你不能创建一个数据框然后打印出来呢?谢谢,看起来简单一点。可以用
groupby.mean()
对var1
进行操作的例子来详细说明您的答案吗?我特别感兴趣(并且坚持)在其他级别(即参与者、ses或代表)对值的1D数组求平均值这样我就可以在不同条件下得到一个平均值数组。这是一样的,只需将列的值更改为0、1、2或3即可。它不工作吗?它确实计算平均值,但它提供了所有值的平均值(即单个值)。在我的数据中,values
包含一个长度为1000的数组,我想要的是对整个数组进行平均,获得长度为1000的平均数组。在这种情况下,您可以垂直堆叠数据:将np.hstack(x.mean()
替换为np.vstack(x.mean)(axis=0)
。这就是你想要的输出吗?
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