【问题标题】:ValueError: Can only compare identically-labeled Series objects in pandasValueError:只能比较熊猫中标记相同的系列对象
【发布时间】:2018-11-13 19:05:20
【问题描述】:

我有两个这样的数据框。

df1
MainId,Time,info1,info2
100,2018-07-12 08:05:00,a,b
100,2018-07-12 08:07:00,x,y
101,2018-07-14 16:00,c,d
100,2018-07-14 19:30:00,d,e
104,2018-07-14 03:30:00,g,h

df2
Id,MainId,startTime,endTime,value
1,100,2018-07-12 08:00:00,2018-07-12 08:10:00,1001
2,150,2018-07-14 10:05:00,2018-07-14 17:05:00,1002
3,101,2018-07-12 0:05:00,2018-07-12 19:05:00,1003
4,100,2018-07-12 08:05:00,2018-07-12 08:15:00,1004

df2 是主数据帧,df1 是子数据帧。我想检查df2starttimeendtime 以及df1 中的时间与MainId。如果df1.Time isin df2(start and endtime) 对应于MainId,那么我想将df1 的info1info2 列包含到df2。如果没有值,那么我只想输入 nan。

我想要这样的输出

Id,MainId,info1,info2,value
1,100,a,b,1001
1,100,x,y,1001
2,150,nan,nan,1002
3,101,nan,nan,1003
4,100,a,b,1004
4,100,x,y,1004

这里我在输出中有两个相同的 Id(In Id1) 和 MainId,因为它们有不同的 info1 和 info2,我也想包含那个。

这就是我在 pandas 中所做的事情

df2['info1'] = np.where((df2['MainId'] == df1['MainId'])& (df1['Time'].isin([df2['startTime'], df2['endTime']])),df1['info1'], np.nan)

但它会抛出错误

ValueError: Can only compare identically-labeled Series objects

我该如何解决这个错误?有没有更好的办法 ?

【问题讨论】:

  • 您应该合并on=MainId,然后使用布尔掩码查找时间间隔。它与this answer 非常相似,尽管在这种情况下您只是基于MainId 进行合并
  • @ALollz 我首先尝试使用merge,但我发现的问题是,合并后,在时间为(开始和结束)时选择数据时,可能有些原始来自df2 的数据丢失。我需要从df2 返回所有数据(问题的预期输出)

标签: python pandas dataframe


【解决方案1】:

df1df2 有不同的Index(您可以通过检查df1.indexdf2.index 来检查这一点。因此,当您执行df2['MainId'] == df1['MainId'] 时,您有2 个不可比较的系列对象。

尝试使用左连接,例如:

df3 = df2.join(df1.set_index('MainId'), on='MainId'))

应该给你你想要的数据框。然后,您可以使用它来执行比较。

【讨论】:

  • 我不确定,在这种情况下合并数据框是否是一个好的解决方案。
  • 为什么不呢?您将需要以某种方式这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2018-12-06
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多