在pandas中将浮点数Series转换为整数Series

9

I have the following data frame:

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

如上所述,我希望根据时间创建组。因此预期的子组将是具有时间 1379945413799456 的行。我这样做:

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或list作为参数?Pandas中是否有任何方法可以实现此操作?

3个回答

16

尝试使用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')

...

3
使用 astype() 是正确的,但更好的做法是完全避免使用列表推导式。例如 ts['time'] = (ts.time / 100).astype('int'),然后使用 ts.groupby('time') 进行分组等操作... - Rutger Kassies
同意,避免使用列表推导式会更好,我将编辑我的答案以反映。 - C Mars

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

按1分钟分组并求平均值(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

谢谢@Jeff!这个方法看起来不错。有些方法对我来说是新的。我会试一试的。目前,我会使用@drexiya给出的答案。 - Geekster
谢谢@Jeff。在发表评论后,我找到了这个资源。因此,我已经删除了提到它的评论。 - Geekster

0

这里有另一种将 ts 转换为类型为 intSeries 的相当通用的方法:

rise_p['ts'] = (rise_p.time / 100).apply(lambda val: int(val))

apply 允许您逐个对 Series 对象的值应用任意函数。 apply 也可用于 DataFrame 对象的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接