如何通过比较另一个数据框中的值将值分配给数据框的列

时间:2018-09-09 22:35:25

标签: python python-3.x pandas numpy

我有两个数据帧。一天中每五分钟有一排:

df

         TIMESTAMP              TEMP
1        2011-06-01 00:05:00    24.5
200      2011-06-01 16:40:00    32.0
1000     2011-06-04 11:20:00    30.2
5000     2011-06-18 08:40:00    28.4
10000    2011-07-05 17:20:00    39.4
15000    2011-07-23 02:00:00    29.3
20000    2011-08-09 10:40:00    29.5
30656    2011-09-15 10:40:00    13.8

我还有另一个对日期进行排名的数据框

ranked

      TEMP    DATE          RANK
62    43.3    2011-08-02    1.0
63    43.1    2011-08-03    2.0
65    43.1    2011-08-05    3.0
38    43.0    2011-07-09    4.0
66    42.8    2011-08-06    5.0
64    42.5    2011-08-04    6.0
84    42.2    2011-08-24    7.0
56    42.1    2011-07-27    8.0
61    42.1    2011-08-01    9.0
68    42.0    2011-08-08    10.0

TIMESTAMPDATE均为日期时间数据类型(dtype返回dtype('M8[ns]')

我想做的是在数据框df中添加一列,然后根据TIMESTAMPranked中相应天的排名来放入行的排名(因此一天中所有5分钟的时间步都将具有相同的排名)。

因此,最终结果将如下所示:

df

         TIMESTAMP              TEMP    RANK
1        2011-06-01 00:05:00    24.5    98.0
200      2011-06-01 16:40:00    32.0    98.0
1000     2011-06-04 11:20:00    30.2    96.0
5000     2011-06-18 08:40:00    28.4    50.0
10000    2011-07-05 17:20:00    39.4    9.0
15000    2011-07-23 02:00:00    29.3    45.0
20000    2011-08-09 10:40:00    29.5    40.0
30656    2011-09-15 10:40:00    13.8    100.0

到目前为止我所做的:

# Separate the date and times.
df['DATE'] = df['YYYYMMDDHHmm'].dt.normalize()
df['TIME'] = df['YYYYMMDDHHmm'].dt.time
df = df[['DATE', 'TIME', 'TAIR']]
df['RANK'] = 0
for index, row in df.iterrows():
    df.loc[index, 'RANK'] = ranked[ranked['DATE']==row['DATE']]['RANK'].values

但是我认为我朝着错误的方向前进,因为这需要很长时间才能完成。

如何改进此代码?

1 个答案:

答案 0 :(得分:2)

IIUC,您可以使用索引来匹配值

df = df.set_index(df.TIMESTAMP.dt.date)\
       .assign(RANK=ranked.set_index('DATE').RANK)\
       .set_index(df.index)