我有两个数据帧,如下所示:
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.value
和df2.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
组中前进,这会导致虚假的结果。
答案 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)]