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。我把桌子固定在我的柱子上。在我之前的编辑中,我错过了您所看到的内容。