Python 熊猫:通过将二维字典映射到另一个系列来创建系列
我试图在一个数据帧中创建一个新的序列,该序列沿着两个维度映射字典,首先匹配键,然后匹配数组中的值。现有序列是日期时间,键匹配与日期匹配,值匹配是小时(因此新序列Python 熊猫:通过将二维字典映射到另一个系列来创建系列,python,pandas,mapping,Python,Pandas,Mapping,我试图在一个数据帧中创建一个新的序列,该序列沿着两个维度映射字典,首先匹配键,然后匹配数组中的值。现有序列是日期时间,键匹配与日期匹配,值匹配是小时(因此新序列'dh') 在这里映射一维数组也有一个类似的问题:,但这会将整个数组映射到每一天 当前代码: import pandas as pd df = pd.DataFrame({'datetime':pd.date_range('1/1/2018','1/4/2018', freq = '1H', closed = 'left')}) da
'dh'
)
在这里映射一维数组也有一个类似的问题:,但这会将整个数组映射到每一天
当前代码:
import pandas as pd
df = pd.DataFrame({'datetime':pd.date_range('1/1/2018','1/4/2018', freq = '1H', closed = 'left')})
day_hour = {1:range(48,0,-2),
2:range(96,0,-4),
3:range(120,0,-5) }
df['dh'] = df['datetime'].dt.day.map(day_hour)
输出代码段:
datetime dh
0 2018-01-01 00:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
1 2018-01-01 01:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
2 2018-01-01 02:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
3 2018-01-01 03:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
4 2018-01-01 04:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
5 2018-01-01 05:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
6 2018-01-01 06:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
7 2018-01-01 07:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
8 2018-01-01 08:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
9 2018-01-01 09:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
10 2018-01-01 10:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
11 2018-01-01 11:00:00 [48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 2...
期望输出:
datetime dh
0 2018-01-01 00:00:00 48
1 2018-01-01 01:00:00 46
2 2018-01-01 02:00:00 44
3 2018-01-01 03:00:00 42
4 2018-01-01 04:00:00 40
5 2018-01-01 05:00:00 38
...
如果dict创建得很好,则不需要map
df['dh']=sum(map(list,day_hour.values()),[])
更新
df['dh'] = df['datetime'].dt.day.map(day_hour)
df['new']=df.groupby(df['datetime'].dt.date).cumcount()
df['dh']=df.apply(lambda x : x['dh'][x['new']],axis=1)
我在和你的问题打高尔夫
df.assign(dh=[h[t.hour] for t, h in df.values])
datetime dh
0 2018-01-01 00:00:00 48
1 2018-01-01 01:00:00 46
2 2018-01-01 02:00:00 44
3 2018-01-01 03:00:00 42
4 2018-01-01 04:00:00 40
...
你想要的输出是什么?谢谢温家宝,但是你能澄清一下“精心创建”的dict是什么意思吗?@pshep123是根据你的数据帧的顺序创建的,意思是
df['datetime'].dt.day
return[1,2,3]
,dict键应该是[1,2,3],那么根据上面的例子,就是这样。但是,现在我在完整代码(与此示例代码相比)上遇到了问题,并且获取值的长度与索引的长度不匹配
错误。@pshep123在真实数据中我们是否同时具有2018-01-01 00:00:00
和2018-02-01 00:00:00
?是-将有多个匹配项。