2014-01-08 3 views
0

Привет,Среднее панд TimeSeries с использованием .groupby()

У меня есть некоторая непрерывная х/у координаты из поведенческого эксперимента, который я хотел бы, чтобы в среднем в группах с использованием панды.

Я использую подмножество данных здесь.

data 
Out[11]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 2036 entries, 0 to 1623 
Data columns (total 9 columns): 
id    2036 non-null values 
subject   2036 non-null values 
code    2036 non-null values 
acc    2036 non-null values 
nx    2036 non-null values 
ny    2036 non-null values 
rx    2036 non-null values 
ry    2036 non-null values 
reaction_time 2036 non-null values 
dtypes: bool(1), int64(3), object(5) 

nx и ny провести серию TimeSeries объектов, все из которых имеют одинаковые индексы.

data.nx.iloc[0] 
Out[16]: 
0  0 
1  0 
2  0 
3  0 
4  0 
5  0 
6  0 
7  0 
8  0 
9  0 
10 0 
11 0 
12 0 
13 0 
14 0 
... 
86  1.019901 
87  1.010000 
88  1.010000 
89  1.005921 
90  1.000000 
91  1.000000 
92  1.000000 
93  1.000000 
94  1.000000 
95  1.000000 
96  1.000000 
97  1.000000 
98  1.000000 
99  1.000000 
100 1.000000 
Length: 101, dtype: float64 

Эти TimeSeries столбцы могут быть в среднем нормально, используя data.nx.mean(), и ведут себя, как ожидалось, но я попал неприятности, когда я пытаюсь группировать данные.

grouped = data.groupby(['code', 'acc']) 
means = grouped.mean() 
print means 
         id   subject reaction_time 
code acc            
group1 False 1570.866667 47474992.333333 1506.000000 
     True 1337.076152 46022403.623246 1322.116232 
group2 False 1338.180180 48730402.045045 1289.112613 
     True 1382.631757 42713592.628378 1294.952703 
group3 False 1488.587156 43202477.623853 1349.568807 
     True 1310.415233 47054310.498771 1341.837838 
group4 False 1339.682540 52530349.936508 1540.714286 
     True 1343.261176 44606616.407059 1362.174118 

Как ни странно, я могу заставить их усреднить данные TimeSeries, и, возможно, придется отступить от взлома таким образом, например, так:

for name, group in grouped: 
    print group.nx.mean() 

0  0.000000 
1  0.000000 
2  0.000000 
3  0.000000 
4  0.000000 
5  0.000667 
6  0.000683 
7  0.001952 
8  0.002000 
9  0.002000 

{etc, 101 values for 6 groups} 

Наконец, если я пытаюсь заставить GroupBy объект в среднем, я получаю следующее:

grouped.nx.mean() 
--------------------------------------------------------------------------- 
DataError         Traceback (most recent call last) 
<ipython-input-25-0b536a966e02> in <module>() 
----> 1 grouped.nx.mean() 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0-py2.7-linux-i686.egg/pandas/core/groupby.pyc in mean(self) 
    357   """ 
    358   try: 
--> 359    return self._cython_agg_general('mean') 
    360   except GroupByError: 
    361    raise 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0-py2.7-linux-i686.egg/pandas/core/groupby.pyc in _cython_agg_general(self, how, numeric_only) 
    462 
    463   if len(output) == 0: 
--> 464    raise DataError('No numeric types to aggregate') 
    465 
    466   return self._wrap_aggregated_output(output, names) 

DataError: No numeric types to aggregate 

Есть идеи?

+0

Вы плаваете данные, все объекты dtype (см. Объект (5)) в информации df. Как вы генерировали/читали данные? (он должен быть float64 dtype для операций с числовым типом) – Jeff

ответ

3

Серия, в которой каждая запись сама по себе является серией, не является идиоматической. Я думаю, что «Нет числовых типов для агрегирования» говорит вам, что панды пытаются взять среднее из списка Series (а не в среднем числовых данных, которые они содержат), которое не определено.

Вы должны организовать свои данные, поэтому nx и ny содержат действительные числа. Может быть проще хранить nx, ny (и, я думаю, rx и ry) в отдельном DataFrame, где каждый столбец соответствует одному id.

+0

Я думал, что '' df.nx.iloc [0] '' просто выглядит неправильно! (так как это должен быть скаляр) – Jeff

+0

Спасибо. Я боялся, что мой ленивый подход приведет к таким проблемам. – Eoin

+0

Нет никакого стыда, начиная с ленивого подхода. : -) –