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
?是-将有多个匹配项。