熊猫:按对象迭代

时间:2017-03-06 23:30:49

标签: python pandas

给出如下数据框:

In [8]:
df
Out[8]:
Experiment  SampleVol   Mass
0   A   1   11
1   A   1   12
2   A   2   20
3   A   2   17
4   A   2   21
5   A   3   28
6   A   3   29
7   A   4   35
8   A   4   38
9   A   4   35
10  B   1   12
11  B   1   11
12  B   2   22
13  B   2   24
14  B   3   30
15  B   3   33
16  B   4   37
17  B   4   42
18  C   1   8
19  C   1   7
20  C   2   17
21  C   2   19
22  C   3   29
23  C   3   30
24  C   3   31
25  C   4   41
26  C   4   44
27  C   4   42

我想对每个实验的数据框进行一些相关性研究。我想要进行的研究是计算' SampleVol'用它的均值('质量')。

groupby函数可以帮助我获得质量的平均值。 grp = df.groupby(['Experiment', 'SampleVol']) grp.mean()

Out[17]:
                       Mass
Experiment  SampleVol   
A            1         11.500000
             2         19.333333
             3         28.500000
             4         36.000000
B            1         11.500000
             2         23.000000
             3         31.500000
             4         39.500000
C            1          7.500000
             2         18.000000
             3         30.000000
             4         42.333333

我理解每个数据帧我应该使用一些numpy函数来计算相关系数。但现在,我的问题是如何迭代每个实验的数据帧。

以下是所需输出的示例。

Out[18]:

Experiment  Slope   Intercept
A            0.91   0.01
B            1.1    0.02
C            0.95   0.03

非常感谢。

1 个答案:

答案 0 :(得分:2)

您只想对“实验”列进行分组,而不是像上面那样对两列进行分组。您可以使用以下代码遍历组并对分组值执行简单的线性回归:

from scipy import stats
import pandas as pd 
import numpy as np

grp = df.groupby(['Experiment'])

output = pd.DataFrame(columns=['Slope', 'Intercept'])

for name, group in grp:
    slope, intercept, r_value, p_value, std_err = stats.linregress(group['SampleVol'], group['Mass'])
    output.loc[name] = [slope,intercept]

print(output)

enter image description here

对于那些好奇的人来说,这就是我生成虚拟数据的方式以及它的外观:

df = pd.DataFrame()
df['Experiment'] = np.array(pd.date_range('2018-01-01', periods=12, freq='6h').strftime('%a'))
df['SampleVol'] = np.random.uniform(1,5,12)
df['Mass'] = np.random.uniform(10,42,12)

enter image description here

参考文献: