Pandas映射列

2024-05-01 05:08:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据帧如下所示:

 DATE        INTV        Y
2005-11-10 00:00:00.000 0
2005-11-10 00:30:00.000 0
2005-11-10 01:00:00.000 0
2005-11-10 01:30:00.000 1
2005-11-10 02:00:00.000 1
2005-11-10 02:30:00.000 0
...
2005-11-10 22:00:00.000 1
2005-11-10 22:30:00.000 3
2005-11-10 23:00:00.000 3
2005-11-10 23:30:00.000 0

我想像这样重新映射INTV列:

00:00:00.000 = 1
00:30:00.000 = 2
01:00:00.000 = 3
01:30:00.000 = 4
...
23:00:00.000 = 47
23:30:00.000 = 48

我试过使用字典和.map函数,但效果并不理想。你知道吗


Tags: 数据函数mapdate字典理想效果intv
3条回答

按字典使用^{},对于相同的格式,使用^{}并按str[0]选择第一个列表:

d = dict(zip(pd.date_range('2015-01-01', '2015-01-01 23:59:59', freq='30T')
               .strftime('%H:%M:%S'), range(1, 49)))

print (d)

{'00:30:00': 2, '13:30:00': 28, '07:00:00': 15, '19:30:00': 40, '12:00:00': 25, 
'10:30:00': 22, '01:30:00': 4, '14:30:00': 30, '21:00:00': 43, '11:00:00': 23, 
'16:00:00': 33, '06:30:00': 14, '05:00:00': 11, '03:00:00': 7, '20:00:00': 41, 
'06:00:00': 13, '01:00:00': 3, '18:00:00': 37, '15:00:00': 31, '09:00:00': 19, 
'19:00:00': 39, '02:30:00': 6, '23:00:00': 47, '02:00:00': 5, '08:30:00': 18, 
'14:00:00': 29, '17:00:00': 35, '13:00:00': 27, '21:30:00': 44, '04:30:00': 10, 
'07:30:00': 16, '18:30:00': 38, '16:30:00': 34, '23:30:00': 48, '00:00:00': 1, 
'17:30:00': 36, '05:30:00': 12, '10:00:00': 21, '11:30:00': 24, '15:30:00': 32, 
'22:00:00': 45, '20:30:00': 42, '04:00:00': 9, '09:30:00': 20, '03:30:00': 8, 
'08:00:00': 17, '12:30:00': 26, '22:30:00': 46}

df['new']=df['INTV'].str.split('.').str[0].map(d)
print (df)
         DATE          INTV  Y  new
0  2005-11-10  00:00:00.000  0    1
1  2005-11-10  00:30:00.000  0    2
2  2005-11-10  01:00:00.000  0    3
3  2005-11-10  01:30:00.000  1    4
4  2005-11-10  02:00:00.000  1    5
5  2005-11-10  02:30:00.000  0    6
6  2005-11-10  22:00:00.000  1   45
7  2005-11-10  22:30:00.000  3   46
8  2005-11-10  23:00:00.000  3   47
9  2005-11-10  23:30:00.000  0   48

细节:

print (df['INTV'].str.split('.').str[0])
0    00:00:00
1    00:30:00
2    01:00:00
3    01:30:00
4    02:00:00
5    02:30:00
6    22:00:00
7    22:30:00
8    23:00:00
9    23:30:00
Name: INTV, dtype: object

另一个改进的josh解决方案:

dates = pd.to_datetime(df['INTV'])
df['new']= dates.dt.hour * 2 + dates.dt.minute//30 + 1
print (df)
         DATE          INTV  Y  new
0  2005-11-10  00:00:00.000  0    1
1  2005-11-10  00:30:00.000  0    2
2  2005-11-10  01:00:00.000  0    3
3  2005-11-10  01:30:00.000  1    4
4  2005-11-10  02:00:00.000  1    5
5  2005-11-10  02:30:00.000  0    6
6  2005-11-10  22:00:00.000  1   45
7  2005-11-10  22:30:00.000  3   46
8  2005-11-10  23:00:00.000  3   47
9  2005-11-10  23:30:00.000  0   48

如果今天添加了仅解析时间,则详细信息-日期不重要:

print (dates)
0   2017-10-17 00:00:00
1   2017-10-17 00:30:00
2   2017-10-17 01:00:00
3   2017-10-17 01:30:00
4   2017-10-17 02:00:00
5   2017-10-17 02:30:00
6   2017-10-17 22:00:00
7   2017-10-17 22:30:00
8   2017-10-17 23:00:00
9   2017-10-17 23:30:00
Name: INTV, dtype: datetime64[ns]

您应该能够定义一个“重映射”函数来进行所需的更改,然后将其应用于INTV系列。你知道吗

df['INTV']=df['INTV'].apply(remap_func)

假设INTV列是datetime列,那么这很简单

df.INTV = df.INTV.dt.hour * 2 + df.INTV.dt.minute/30 + 1

假设它是一个datetime.time列,由于pandas dt不支持datetime.time对象,它就变得有点棘手了

df.INTV = pd.to_datetime(df.Date.dt.strftime('%Y-%m-%d ') + df.INTV.astype(str)))
df.INTV = df.INTV.dt.hour * 2 + df.INTV.dt.minute/30 + 1

在这里,我们只需要从DateINTV列中创建一个虚拟的datetime对象,然后按照上面的方式提取小时和分钟。你知道吗

相关问题 更多 >