Pandas 熊猫-基于多个条件为空列指定值

Pandas 熊猫-基于多个条件为空列指定值,pandas,Pandas,我有以下数据帧: Variable Value Classification Variable_1 18 Variable_1 25 Variable_1 16 Variable_1 34 Variable_2 37 Variable_2 22 Variable_2 14 Variable_2 26 我想通过与下表中定义的间隔/范围进行比较,为上表中的空列分配分类值 Variable Classif from to

我有以下数据帧:

Variable    Value  Classification
Variable_1  18  
Variable_1  25  
Variable_1  16
Variable_1  34
Variable_2  37  
Variable_2  22  
Variable_2  14  
Variable_2  26  
我想通过与下表中定义的间隔/范围进行比较,为上表中的空列分配分类值

Variable    Classif from    to          
Variable_1      A   17      24
Variable_1      B   25      30
Variable_1      C   31      35
Variable_2      A   10      19
Variable_2      B   20      25
Variable_2      C   26      50
第一个表只是实际数据帧的一个示例(原始表有超过20k行)

有人能推荐一种有效的方法吗?
提前感谢

如前所述,条件存在一些问题,因为只有两个值符合条件。我添加了一个
Condition meted?
列,让您将其可视化,从那里您可以删除该列或仅保留
True

在下面的数据中,
df
是您问题中的第一个数据帧,
df2
是第二个:

df2 = pd.merge(df,df1,how='left',on='Variable')
df2['Condition Met?'] = df2['Value'].between(df2['from'], df2['to'])
df2 = df2.sort_values(['Variable', 'Value', 'Condition Met?']).drop_duplicates(['Variable', 'Value'], keep='last')
# df2 = df2[df2['Condition Met?']].drop('Condition Met?', axis=1)
df2
Out[1]: 
      Variable  Value Classif  from  to  Condition Met?
0   Variable_1     18       A    17  24            True
11  Variable_1     37       C    31  35           False
8   Variable_1     54       C    31  35           False
5   Variable_1     65       C    31  35           False
16  Variable_2     22       B    20  25            True
14  Variable_2     37       C    26  50            True
23  Variable_2     66       C    26  50           False
20  Variable_2     78       C    26  50           False
在降落条件满足后?
False的行以及列本身:

df2 = pd.merge(df,df1,how='left',on='Variable')
df2['Condition Met?'] = df2['Value'].between(df2['from'], df2['to'])
df2 = df2.sort_values(['Variable', 'Value', 'Condition Met?']).drop_duplicates(['Variable', 'Value'], keep='last')
df2 = df2[df2['Condition Met?']].drop('Condition Met?', axis=1)
df2
Out[2]: 
      Variable  Value Classif  from  to
0   Variable_1     18       A    17  24
16  Variable_2     22       B    20  25
14  Variable_2     37       C    26  50
或者,如果不满足条件,可以在
Classif
列中返回
NaN

df2 = pd.merge(df,df1,how='left',on='Variable')
df2['Condition Met?'] = df2['Value'].between(df2['from'], df2['to'])
df2 = df2.sort_values(['Variable', 'Value', 'Condition Met?']).drop_duplicates(['Variable', 'Value'], keep='last')
df2['Classif'] = df2['Classif'].where(df2['Condition Met?'],np.nan)
df2 = df2.drop('Condition Met?', axis=1)
df2
Out[3]: 
      Variable  Value Classif  from  to
0   Variable_1     18       A    17  24
11  Variable_1     37     NaN    31  35
8   Variable_1     54     NaN    31  35
5   Variable_1     65     NaN    31  35
16  Variable_2     22       B    20  25
14  Variable_2     37       C    26  50
23  Variable_2     66     NaN    26  50
20  Variable_2     78     NaN    26  50

1.请分享你的数据。2.您的限制不明确:变量1的24是属于A类还是B类?如何为变量2分类20?请详细解释数据的定义和属性。无图像!你能看一下吗:那里的一些答案将帮助你展示如何将文本作为文本输入StackOverFlow问题。变量2的赋值是什么?嗨@BillHuang,谢谢你的及时回复,我编辑了原始帖子。有很多越界值(
)。如何应对?还有,第四排,81到19?谢谢你的快速回复@DavidErickson。我把桌子固定在我的柱子上。在我之前的编辑中,我错过了您所看到的内容。