我是熊猫的新手,并尝试学习如何处理我的多维数据。
我们假设,我的数据是列['A','B','C','D','E','F','G']的大CSV。这些数据描述了一些模拟结果,其中['A','B',...,'F']是模拟参数,'G'是输出之一(本例中只有现有输出!)。
编辑/更新: 正如评论中建议的 Boud 一样,让我们生成一些与我的数据兼容的数据:
import pandas as pd
import itertools
import numpy as np
npData = np.zeros(5000, dtype=[('A','i4'),('B','f4'),('C','i4'), ('D', 'i4'), ('E', 'f4'), ('F', 'i4'), ('G', 'f4')])
A = [0,1,2,3,6] # param A: int
B = [1000.0, 10.000] # param B: float
C = [100,150,200,250,300] # param C: int
D = [10,15,20,25,30] # param D: int
E = [0.1, 0.3] # param E: float
F = [0,1,2,3,4,5,6,7,8,9] # param F = random-seed = int -> 10 runs per scenario
# some beta-distribution parameters for randomizing the results in column "G"
aDistParams = [ (6,1),
(5,2),
(4,3),
(3,4),
(2,5),
(1,6),
(1,7) ]
counter = 0
for i in itertools.product(A,B,C,D,E,F):
npData[counter]['A'] = i[0]
npData[counter]['B'] = i[1]
npData[counter]['C'] = i[2]
npData[counter]['D'] = i[3]
npData[counter]['E'] = i[4]
npData[counter]['F'] = i[5]
np.random.seed = i[5]
npData[counter]['G'] = np.random.beta(a=aDistParams[i[0]][0], b=aDistParams[i[0]][1])
counter += 1
data = pd.DataFrame(npData)
data = data.reindex(np.random.permutation(data.index)) # shuffle rows because my original data doesn't give any guarantees
因为参数['A','B',...,'F']是作为笛卡尔积生成的(意思是:嵌套for循环;先验),我想使用groupby来获取每个参数在分析输出之前可能的“模拟场景”。
参数'F'描述了每个场景的多次运行(每个场景由'A','B',......,'E'定义;让我们假设,'F'是随机种子),所以我的代码变成:
grouped = data.groupby(['A','B','C','D','E'])
# -> every group defines one simulation scenario
grouped_agg = grouped.agg(({'G' : np.mean}))
# -> the mean of the simulation output in 'G' over 'F' is calculated for each group/scenario
我:显示这些组中每个方案参数的所有(唯一)值 - > grouped_agg给了我一个迭代的元组,例如,每个位置0的所有条目都给了我'A'的所有值(所以用几行python我会得到我的唯一值,但也许有一个函数用于)
list(set(grouped_agg.index.get_level_values('A')))
(当对'A'感兴趣时;使用set来获取唯一值;如果你需要高性能,可能不是你想要做的事情)[0, 1, 2, 3, 6]
II :生成一些图(较低维度) - >我需要使一些变量保持不变并在绘图之前过滤/选择我的数据(因此我需要的步骤)=>
我如何生成这样的情节?
我认为,重塑我的数据是关键步骤,熊猫绘图功能将处理它。也许实现一个形状,其中有5列(每个参数A的值一个)和每个索引选择+ param-A选择的相应G值就足够了,但是我还没有能够实现那个形式。
感谢您的投入!
(我在enthought冠层中使用pandas 0.12)
的Sascha
答案 0 :(得分:2)
I:如果我理解你的例子和所需的输出,我不明白为什么需要分组。
data.A.unique()
II:更新....
我将实现您在上面绘制的示例。假设我们对随机种子('F')的平均值为'G',如下所示:
data = data.groupby(['A','B','C','D','E']).agg(({'G' : np.mean})).reset_index()
首先选择B,C和E具有您指定的常量值的行。
df1 = data[(data['B'] == const1) & (data['C'] == const2) & (data['E'] == const3)]
现在我们想要将'G'绘制为'D'的函数,并为'A'的每个值设置不同的颜色。
df1.set_index('D').groupby('A')['G'].plot(legend=True)
我在一些虚拟数据上测试了上面的内容,它就像你描述的那样工作。对应于每个'A'的'G'范围在相同的轴上以不同的颜色绘制。
III:我不知道如何回答这个广泛的问题。
IV:不,我认为这不是你的问题。
我建议使用更简单的小数据集,并熟悉大熊猫。