Python 处理groupby和groupby.size()的输出

Python 处理groupby和groupby.size()的输出,python,pandas,group-by,scipy,conditional-statements,Python,Pandas,Group By,Scipy,Conditional Statements,我有一个pandas数据框,其中包含参与者在用户研究期间操纵的每个对象的一行。每个参与者参与研究3次,每3种情况(a、b、c)各一次,在每种情况下使用大约300-700个对象 当我报告所处理对象的数量时,我希望确保这不会因条件而发生显著变化(我不希望这样做,但需要在统计上确认这一点) 我想我想用方差分析来比较这3种情况,但我不知道如何获得方差分析所需的数据 我目前有一些pandas代码来对数据进行分组,并计算每个参与者在每个条件下的行数(因此我可以使用mean()和类似的方法来总结数据)。具有数

我有一个pandas数据框,其中包含参与者在用户研究期间操纵的每个对象的一行。每个参与者参与研究3次,每3种情况(
a
b
c
)各一次,在每种情况下使用大约300-700个对象

当我报告所处理对象的数量时,我希望确保这不会因条件而发生显著变化(我不希望这样做,但需要在统计上确认这一点)

我想我想用方差分析来比较这3种情况,但我不知道如何获得方差分析所需的数据

我目前有一些pandas代码来对数据进行分组,并计算每个参与者在每个条件下的行数(因此我可以使用mean()和类似的方法来总结数据)。具有数据子集的示例如下所示:

>>> tmp = df.groupby([FIELD_PARTICIPANT, FIELD_CONDITION]).size()
>>> tmp
participant_id  condition
1               a            576
2               b            367
3               a            703
4               c            309
dtype: int64
为了计算方差分析,我通常只通过条件列过滤这些数据,例如:

cond1 = tmp[tmp[FIELD_CONDITION] == CONDITION_A] 
cond2 = tmp[tmp[FIELD_CONDITION] == CONDITION_B] 
cond3 = tmp[tmp[FIELD_CONDITION] == CONDITION_C]
f_val, p_val = scipy.stats.f_oneway(cond1, cond2, cond3)
然而,由于
tmp
是一个
系列
而不是我习惯的
数据帧
,我不知道如何以正常的方式实现这一点

>>> tmp[FIELD_CONDITION]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/pandas/core/series.py", line 583, in __getitem__
    result = self.index.get_value(self, key)
  File "/Library/Python/2.7/site-packages/pandas/indexes/multi.py", line 626, in get_value
    raise e1
KeyError: 'condition'
>>> type(tmp)
<class 'pandas.core.series.Series'>
>>> tmp.index
MultiIndex(levels=[[u'1', u'2', u'3', u'4'], [u'd', u's']],
           labels=[[0, 1, 2, 3], [0, 0, 0, 1]],
           names=[u'participant_id', u'condition'])
>>tmp[现场条件]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Library/Python/2.7/site packages/pandas/core/series.py”,第583行,在__
结果=self.index.get_值(self,key)
get_值中的文件“/Library/Python/2.7/site packages/pandas/index/multi.py”,第626行
提高e1
KeyError:“条件”
>>>类型(tmp)
>>>tmp指数
多索引(级别=[[u'1',u'2',u'3',u'4'],[u'd',u's']],
标签=[[0,1,2,3],[0,0,0,1]],
名称=[u'参与者id',u'条件'])
我确信这是一个很容易解决的问题,但如果没有一些帮助,我似乎无法达到目的:)

我认为您需要,然后输出是
数据帧:

tmp = df.groupby([FIELD_PARTICIPANT, FIELD_CONDITION]).size().reset_index(name='count')
样本:

import pandas as pd

df = pd.DataFrame({'participant_id': {0: 1, 1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 3, 8: 4, 9: 4},
                   'condition': {0: 'a', 1: 'a', 2: 'a', 3: 'a', 4: 'b', 5: 'b', 6: 'b', 7: 'a', 8: 'c', 9: 'c'}})
print (df)
  condition  participant_id
0         a               1
1         a               1
2         a               1
3         a               1
4         b               2
5         b               2
6         b               2
7         a               3
8         c               4
9         c               4

tmp = df.groupby(['participant_id', 'condition']).size().reset_index(name='count')
print (tmp)
   participant_id condition  count
0               1         a      4
1               2         b      3
2               3         a      1
3               4         c      2
如果需要使用
系列
,您可以使用条件,通过以下方式选择
多索引的
级别的值:

tmp = df.groupby(['participant_id', 'condition']).size()
print (tmp)
participant_id  condition
1               a            4
2               b            3
3               a            1
4               c            2
dtype: int64

print (tmp.index.get_level_values('condition'))
Index(['a', 'b', 'a', 'c'], dtype='object', name='condition')

print (tmp.index.get_level_values('condition') == 'a')
[ True False  True False]

print (tmp[tmp.index.get_level_values('condition') == 'a'])
participant_id  condition
1               a            4
3               a            1
dtype: int64