将值从一个数据帧转换为另一个数据帧

时间:2018-04-24 18:54:28

标签: python pandas dataframe

我有一个包含旅程信息的数据框,另一个包含有关位置和区域的信息。

     Origin       Coordinates     Time
0    Victoria     x,y             15:32
1    Wembley      x,y             14:00
2    Canary Wharf x,y             11:00
3    Stratford    x,y             09:00




     Station    Zone
0    Victoria   1
1    Waterloo   1
2    Stratford  2

我想从第二个数据框中获取信息,并添加一个“原始区域”'列到第一个数据帧,带有适当的区域。

到目前为止,我已尝试过以下内容:

def getZone(Station):
    return stations[stations.Station == Station]['Zone'].values[0]


df['OriginZone'] = getZone(df['Origin'])

ValueError:只能比较带有相同标签的Series对象

首先,为什么我会收到此错误?我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

我认为你期待merge你的数据帧。如果您的第一个数据帧是df_1,而您的第二个数据帧是df_2,请尝试以下操作:

df_1.merge(df_2, left_on = 'Origin', right_on='Station', how='left').drop('Station', axis=1)

返回:

         Origin Coordinates   Time  Zone
0      Victoria         x,y  15:32   1.0
1       Wembley         x,y  14:00   NaN
2  Canary Wharf         x,y  11:00   NaN
3     Stratford         x,y  09:00   2.0

请注意,NaN存在,因为您Zone中的df_2数据丢失了{。}}。

解释:这会使用merge,它会将df_1['Origin']df_2['Station']匹配的两个数据帧组合在一起。我选择了how = 'left',这样就不会从丢失数据的左侧数据框(df_1)中删除行,最后删除了额外的Station列,这是您的目的不需要的

至于为什么你会收到这个错误,我认为你的代码试图做的一些事情是行不通的,但是突然出现的主要问题是你正在调用getZone使用pd.Series作为参数,因此它会尝试将您的stations数据框(在您的示例中为长度为4)与您的df['Origin'](长度为3)进行比较。即使长度和指数匹配,我也不确定这会达到你想要的效果。您可以使用循环和.loc语句来执行此操作,但这会很笨拙。 merge因这些原因而存在!