社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python-numpy.where和字典

Runawaygeek • 6 年前 • 1855 次点击  

我可能做错了,或者有比这更好的方法,因为我还是python新手。对任何明显的错误预先道歉。

我有一个pandas数据框,它有一个str列,其中包含日期和时间。它是str,因为时间是“广播”格式的,这意味着一天有29个小时。所以我们会看到像2018年1月1日29:59:59这样的日期。 作为第1秒和2018年1月2日06:00:00。

我的目标是将这些数据转换为实时数据。这意味着24到29之间的任何一个小时都需要换班。 我已经将str拆分为两个新列['dt']和['ti'],从['ti']中抽出一个小时到一个新列['hr']并将其设为int。

然后我将pd.to_datetime应用于['dt']并添加了一个规则。

df['Dt'] = np.where(df['Hr'] > 23, df['Dt']+pd.DateOffset(1),df['Dt']+pd.DateOffset(0) )

这很好用。

我现在需要将小时更改为实时,例如24=00、25=02等。

我想最好的方法是用一个口述稿并绘制地图,所以我做了一个口述稿,

HourMap = {'24':'00','25':'01','26':'02','27':'03','28':'04','29':'05','30':'06'}  

然后写了这个

df['Hr1'] = np.where(df['Hr'] > 23, df.replace({'Hr':HourMap}),df['Hr'])

但我得到一个“价值错误”

ValueError: operands could not be broadcast together with shapes (273,) (273,29) (273,)

我看过数据框中的那些行,它们只是普通的int。在测试时,我可以对它们应用数学(例如df['test']=df['hr']+1。

我确实将它们转换为str并尝试相同的规则,但得到了相同的错误。

我是不是疯了?

谢谢,

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40353
文章 [ 2 ]  |  最新文章 6 年前
jezrael
Reply   •   1 楼
jezrael    7 年前

我相信需要改变:

df.replace({'Hr':HourMap})

map 如果某些值不匹配并返回 NaN 将其替换为原始值 fillna :

df['Hr'].map(HourMap).fillna(df['Hr'])
#alternative solution if performance is not important in large df
#df['Hr'].replace(HourMap)

因为 df.replace 返回包含替换列的dataframe的所有列 Hr

Dan
Reply   •   2 楼
Dan    7 年前

你真的不应该在这里用字典,你甚至不需要 np.where . 使用 modulo operator

In [1]: import numpy as np
In [2]: np.arange(31)%24
Out[2]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23,  0,  1,  2,  3,  4,  5, 6], dtype=int32)

你有24的数字,这是模块的教科书用例。所以完整的代码就是:

df['Hr1'] = df['Hr'] % 24

同样的道理,你可以在没有 在哪里 利用整数除法

df['Dt'] = df['Dt']+pd.DateOffset(Df['Hr']//24)