使用Python的Pandas按箱查找平均值

时间:2014-07-11 16:33:10

标签: python pandas bin

我刚开始使用大熊猫来分析地下水井数据。

我在文本文件中的数据看起来像(site_no,date,well_level):

485438103132901 19800417    -7.1

485438103132901 19800506    -6.8

483622101085001 19790910    -6.7

485438103132901 19790731    -6.2

483845101112801 19801111    -5.37

484123101124601 19801111    -5.3

485438103132901 19770706    -4.98

我希望输出的平均水平分为5年增量和计数:

site_no   avg 1960-end1964  count    avg 1965-end1969  count    avg 1970-end1974 count

我正在阅读数据:

names = ['site_no','date','wtr_lvl']
df = pd.read_csv('D:\info.txt', sep='\t',names=names)

我可以通过网站找到整体平均值:

avg = df.groupby(['site_no'])['wtr_lvl'].mean().reset_index()

我的粗垃圾箱尝试使用:

a1 = df[df.date > 19600000]
a2 = a1[a1.date < 19650000]
avga2 = a2.groupby(['site_no'])['wtr_lvl'].mean()

我的问题:如何根据需要加入结果?我尝试了合并,加入和追加,但它们不允许空数据帧(这种情况发生)。此外,我确信有一种简单的方法可以按日期对数据进行分区。感谢。

2 个答案:

答案 0 :(得分:6)

最简洁的方法可能是将其转换为timeseris数据并将其缩减采样以获取方法:

In [75]:

print df
                         ID  Level
1                                 
1980-04-17  485438103132901  -7.10
1980-05-06  485438103132901  -6.80
1979-09-10  483622101085001  -6.70
1979-07-31  485438103132901  -6.20
1980-11-11  483845101112801  -5.37
1980-11-11  484123101124601  -5.30
1977-07-06  485438103132901  -4.98
In [76]:

df.Level.resample('60M', how='mean') 
#also may consider different time alias: '5A', '5BA', '5AS', etc:
#see: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases
Out[76]:
1
1977-07-31   -4.980
1982-07-31   -6.245
Freq: 60M, Name: Level, dtype: float64

或者,您可以将groupbycut一起使用:

In [99]:

print df.groupby(pd.cut(df.index.year, pd.date_range('1960', periods=5, freq='5A').year, include_lowest=True)).mean()
                        ID     Level
[1960, 1965]           NaN       NaN
(1965, 1970]           NaN       NaN
(1970, 1975]           NaN       NaN
(1975, 1980]  4.847632e+14 -6.064286

还有ID:

In [100]:

print df.groupby(['ID', 
                  pd.cut(df.index.year, pd.date_range('1960', periods=5, freq='5A').year, include_lowest=True)]).mean()
                              Level
ID                                 
483622101085001 (1975, 1980]  -6.70
483845101112801 (1975, 1980]  -5.37
484123101124601 (1975, 1980]  -5.30
485438103132901 (1975, 1980]  -6.27

答案 1 :(得分:0)

所以我想要做的是创建一个带有圆角箱号的单独列:

    bin_width = 50000
    mult = 1. / bin_width
    df['bin'] = np.floor(ser * mult + .5) / mult

然后,只按箱子分组

    df.groupby('bin').mean()

另一方面,您可以一次性进行多项真值评估:

    df[(df.date > a) & (df.date < b)]