我有以下数据框:
In [31]: rise_p
Out[31]:
time magnitude
0 1379945444 156.627598
1 1379945447 1474.648726
2 1379945448 1477.448999
3 1379945449 1474.886202
4 1379945699 1371.454224
现在,我想对一分钟内的行进行分组。所以我将时间序列除以100.我明白了:
In [32]: rise_p/100
Out[32]:
time magnitude
0 13799454.44 1.566276
1 13799454.47 14.746487
2 13799454.48 14.774490
3 13799454.49 14.748862
4 13799456.99 13.714542
如上所述,我想根据时间创建群组。因此,预期的子组将是时间为13799454
和13799456
的行。我这样做:
In [37]: ts = rise_p['time']/100
In [38]: s = rise_p/100
In [39]: new_re_df = [s.iloc[np.where(int(ts) == int(i))] for i in ts]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-39-5ea498cf32b2> in <module>()
----> 1 new_re_df = [s.iloc[np.where(int(ts) == int(i))] for i in ts]
TypeError: only length-1 arrays can be converted to Python scalars
如何将ts
转换为整数系列,因为int()不会将Series或列表作为参数?大熊猫有没有这样做的方法呢?
答案 0 :(得分:13)
尝试使用astype进行转换:
new_re_df = [s.iloc[np.where(ts.astype(int) == int(i))] for i in ts]
修改强>
根据@Rutger Kassies的建议,一个更好的方法是投射系列然后再分组:
rise_p['ts'] = (rise_p.time / 100).astype('int')
ts_grouped = rise_p.groupby('ts')
...
答案 1 :(得分:4)
这是解决问题的另一种方法
In [3]: df
Out[3]:
time magnitude
0 1379945444 156.627598
1 1379945447 1474.648726
2 1379945448 1477.448999
3 1379945449 1474.886202
4 1379945699 1371.454224
In [4]: df.dtypes
Out[4]:
time int64
magnitude float64
dtype: object
将您的纪元时间戳转换为秒
In [7]: df['time'] = pd.to_datetime(df['time'],unit='s')
设置索引
In [8]: df.set_index('time',inplace=True)
In [9]: df
Out[9]:
magnitude
time
2013-09-23 14:10:44 156.627598
2013-09-23 14:10:47 1474.648726
2013-09-23 14:10:48 1477.448999
2013-09-23 14:10:49 1474.886202
2013-09-23 14:14:59 1371.454224
Groupby 1min并且意味着结果(how=
也可以是任意函数)
In [10]: df.resample('1Min',how=np.mean)
Out[10]:
magnitude
time
2013-09-23 14:10:00 1145.902881
2013-09-23 14:11:00 NaN
2013-09-23 14:12:00 NaN
2013-09-23 14:13:00 NaN
2013-09-23 14:14:00 1371.454224
答案 2 :(得分:0)
这是将ts
转换为类型Series
的{{1}}的另一种通用方法:
int
rise_p['ts'] = (rise_p.time / 100).apply(lambda val: int(val))
允许您按值将任意函数应用于apply
对象值。 Series
也适用于DataFrame对象的列。