使用datetime64类型作为映射值的Pandas map()函数

时间:2018-07-17 17:06:34

标签: python pandas

我正尝试从字典Temperature向我的数据框data添加新列weather。使用map()函数将data中的日期与weather中的日期进行匹配,两者均为datetime64格式。

import pandas as pd

# Import first dataset and convert dates to datetime64
filename = 'Process Data.csv'
data = pd.read_csv(filename)
data['trans_date1'] = pd.to_datetime(data.trans_date1)

# Import second dataset and convert dates to datetime64
filenameWeather = '2014-2018 Weather Data.csv'
dataWeather = pd.read_csv(filenameWeather, parse_dates=True)
dataWeather['Date_Time'] = pd.to_datetime(dataWeather.Date_Time)


# Create new dataframe to hold only the date and temp 
weather = dataWeather[[('Date_Time'), 'Mean_Temp_?C']].copy()

# Convert this to a dict
weather = weather.to_dict('split')

# map weather data to main dataset
data['Temperature'] = data['trans_date1'].map(weather)

这不会产生错误,但是不会复制任何温度,它们都是NaN。我也尝试过使用不同的选项将数据帧转换为dict(序列,拆分,索引,列表,但记录会产生错误)。

我已经检查了日期和温度,并且数据确实存在,因此它应该已经找到了要映射到特定日期的内容。

我还尝试过在映射之前将日期转换为字符串,这也不会导致错误,但是它只会为NaN中的所有内容输出Temperature

1 个答案:

答案 0 :(得分:0)

weather = weather.to_dict('split')

产生具有结构的字典

{'columns': [...],
 'data': [...],
 'index': [...] }

但是,如果您想将地图与词典结合使用,则词典应具有结构

{'match_value_1': 2,
 'match_value_2': 3,
  etc. }

假设您不想在一开始就更改字典表示形式的类型,那么您可以稍后再转换字典以适应上述方法:

data['Temperature'] = data['trans_date1'].map(dict(weather['data']))

或者您从字典中重建一个数据框并合并它们:

weather = pandas.DataFrame(temps['data'], columns=['Date_Time', 'Mean_Temp_?C'])
df1 = df1.merge(weather, how='inner', left_on='trans_date1', right_on='Date_Time')

要执行哪种合并取决于您的逻辑。如果您需要进一步的帮助,请对此进行详细说明。