现在我有两个看起来像的数据框:
c = pd.DataFrame({'my_goal':[3, 4, 5, 6, 7],
'low_number': [0,100,1000,2000,3000],
'high_number': [100,1000,2000,3000,4000]})
和
a= pd.DataFrame({'a':['a', 'b', 'c', 'd', 'e'],
'Number':[50, 500, 1030, 2005 , 3575]})
我想做的是,如果“数字”介于低数字和高数字之间,我希望它带回“ my_goal”中的值。例如,如果我们查看“ a”,它的“数字是100,所以我希望它带回3”。我还想创建一个数据框,其中包含数据框a中的所有列和数据框c中的“ my_goal”列。我希望输出看起来像:
我尝试将高低数字组合成一个单独的列表,然后运行一个for循环,但是所有给我的都是'my_goal'数字:
low_number= 'low_number': [0,100,1000,2000,3000]
for i in a:
if float(i) >= low_number:
a = c['my_goal']
print(a)
答案 0 :(得分:3)
您可以使用pd.cut
,当我看到范围时,我首先想到的是pd.cut:
dfa = pd.DataFrame(a)
dfc = pd.DataFrame(c)
dfa['my_goal'] = pd.cut(dfa['Number'],
bins=[0]+dfc['high_number'].tolist(),
labels=dfc['my_goal'])
输出:
a Number my_goal
0 a 50 3
1 b 500 4
2 c 1030 5
3 d 2005 6
4 e 3575 7
答案 1 :(得分:2)
我略微更改了第4行,以包含一个不满足条件的测试用例。您可以在条件为真的情况下将a与c行合并。
a= pd.DataFrame({'a':['a', 'b', 'c', 'd', 'e'],'Number':[50, 500, 1030, 1995 , 3575]})
cond= a.Number.between( c.low_number, c.high_number)
pd.concat([a, c.loc[cond, ['my_goal']] ], axis = 1, join = 'inner')
Number a my_goal
0 50 a 3
1 500 b 4
2 1030 c 5
4 3575 e 7