Одна из самых больших проблем, с которыми я столкнулся в Python Pandas, - это постоянный дефолт по типу pandas.core.series.Series. например
import numpy as np
import pandas as pd
a = pd.DataFrame( np.random.randn(5,5),columns=list('ABCDE') )
b = a.mean(axis=0)
>>> b
A 0.399677
B 0.080594
C 0.060423
D -1.206630
E 0.153359
dtype: float64
>>> type(b)
<class 'pandas.core.series.Series'>
Поэтому, если я пытаюсь вставить в новый кадр данных, я получаю всевозможные ошибки (т.е. Несоответствие размеров и т.д.). Мне кажется, что когда я выполняю операцию на кадре данных, выход должен быть кадром данных, а не серией. Кто-нибудь имеет рекомендации по использованию, например df.mean(), и возвращает ли кадр данных?
НАЧАТЬ ИЗМЕНЕНИЕ Извините, я должен был дать более подробную информацию.
Я хочу выборочно усреднять срезы из моего исходного фрейма данных и вставлять эти усредненные значения в отдельный фрейм данных.
# This is how I've been trying to do it
# Using <a> from above
b = pd.DataFrame()
# Select out data from original data frame
tmp = a(a.A>5).mean() # Just an example, this is not really my selection criteria
# Now I want to store these averaged values in my aggregated data frame.
b = pd.concat( [b,tmp] )
Я предполагаю, что мой реальный вопрос: как я могу усреднять данные в одном кадре данных и передавать его в другой для хранения? END EDIT
EDIT Take 2 У меня есть два набора данных (оба хранятся как кадры данных), оба из которых являются временными рядами. Оба временных ряда имеют нерегулярные отметки времени: у каждого есть отметка времени каждые ~ 90 с (между часами 0700 - 2000), другая - одна или две метки времени в день (данные спутникового эстакады)). Ни одна из марок времени не является регулярной (т.е. Они редко встречаются в одно и то же время, и они очень редко сосредоточены на часе, а также на полчаса и т.д.). Моя цель - взять мои высокочастотные данные и усреднить их по отметке времени спутника (+ / - 30 минут), а затем сохранить усредненные данные в новом кадре данных. Вот фактический код, который я написал до сих пор:
# OMI is the satellite data, ~daily resolution
# Pan is surface data, with 90s resolution
# Example data:
>>> pan.head()
hcho h2o so2 o3 no2
2010-06-24 14:01:20 0.87784 2.9947 NaN NaN 0.671104
2010-06-24 14:03:52 0.68877 3.0102 NaN NaN 0.684615
2010-06-24 14:04:35 NaN NaN 0.58119 285.76 NaN
2010-06-24 14:05:19 0.75813 3.0218 NaN NaN 0.693880
2010-06-24 14:06:02 NaN NaN 0.40973 286.00 NaN
>>> omi.head()
ctp dist no2 no2std cf
2010-06-24 17:51:43 7 23.8 5.179200e+15 1.034600e+15 0.001
2010-06-26 17:39:34 3 7.0 7.355800e+15 1.158100e+15 0.113
2010-07-01 17:57:40 9 8.4 5.348300e+15 9.286100e+14 0.040
2010-07-03 17:45:30 5 32.2 5.285300e+15 8.877800e+14 0.000
# Code
out = pd.DataFrame()
width = 30 # Defined earlier, input of function
for r in omi.index:
# Define datetime limits
d1 = r - dt.timedelta(minutes=width)
d2 = r + dt.timedelta(minutes=width)
tmp = pan.truncate(d1,d2).mean(axis=0,skipna=True)
if tmp.nunique()<>0: # Ensuring there is something in <tmp>
tmp = pd.DataFrame(tmp,index=[r],columns=pan.columns)
out = pd.concat([out,tmp],axis=0,ignore_index=False)
Вы можете просто построить DataFrame из серии так легко:
c = DataFrame(a.mean(axis=0), columns=['mean'])
c
Out[91]:
mean
A -0.210582
B -0.742551
C 0.347408
D 0.276034
E 0.399468
Тем не менее, я не понимаю, что это действительно для вас делает лучше, чем оригинальная возвращенная серия?
df.mean()
- операция сокращения, по определению она будет агрегировать по указанным измерениям, уменьшая размер возвращаемого объекта на 1