当值完全不匹配时,比较两个数据帧中的列

时间:2015-09-01 23:49:25

标签: python pandas

我有两个数据帧,如下所示:

In [2]: df1 = pd.DataFrame({'item': ['foo', 'foo', 'bar', 'bar', 'bar', 'qux', 'baz'],
   ...:                     'name': ['apple', 'bird', 'apple', 'bird', 'car', 'car', 'bird'],
   ...:                     'value': [999, 1103, 1070, 1210, 1521, 1622, 1550]})

In [3]: df1
Out[3]:
  item   name  value
0  foo  apple    999
1  foo   bird   1103
2  bar  apple   1070
3  bar   bird   1210
4  bar    car   1521
5  qux    car   1622
6  baz   bird   1550

In [4]: df2 = pd.DataFrame({'item': ['foo', 'foo', 'bar', 'qux'],
   ...:                     'size': [1076, 1266, 1380, 1620],
   ...:                     'total': [5, 10, 5, 13]})

In [5]: df2
Out[5]:
  item  size  total
0  foo  1076      5
1  foo  1266     10
2  bar  1380      5
3  qux  1620     13

我想检查df2.size,将其与df1.value进行比较,然后将相应的df1.name添加到df2。

踢球者df1.valuedf2.size很少完全匹配;相反,我希望最接近的df1.value 少于而不是(或等于)df2.size值。换句话说,参考上面的df1,在“foo”项目组中,值999和1102之间的任何内容都是“apple”组的一部分,1103以上的任何内容都是“bird”组的一部分。 / p>

此外,item需要在数据帧之间进行匹配。换句话说,来自df2的被归类为“foo”size的{​​{1}}条目只能与df1中的“foo”进行比较。

我想要的输出类似于:

item

有没有人对如何解决这个问题有任何想法?

我可以采用的一种方法是 item name size total 0 foo apple 1076 5 1 foo bird 1266 10 2 bar bird 1380 5 3 qux NaN 1620 13 数据框,然后排序pd.concat,然后排序['item', 'value'] ffill列,然后过滤name不是空的。但问题是,在某些情况下,我会在size组中前进,这会导致虚假的结果。

1 个答案:

答案 0 :(得分:0)

好的,我还没有在更大范围内对此进行测试,但根据Paul的建议,我已经完成了我在我提供的样本数据集上所要实现的目标。

第一步是将df2.size重命名为value,以简化pd.concat

df2.rename(columns={'size':'value'}, inplace=True)

然后连接数据帧,并按项和值对新帧进行排序:

df3 = pd.concat([df1, df2], axis=0).sort(['item', 'value'])

下一步是将df3.name列替换为前向填充的groupby系列:

df3['name'] = df3.groupby(['item'])['name'].ffill()

最后一步是过滤掉df3.total为空的行:

df3[pd.notnull(df3.total)]