这是从调查中收集的数据,其中有一个单选按钮可以从 5 个选项中选择一个。列中存储的是一个简单的 1 作为标志,表示它已被选中。
我想以列标题作为值的单个列结束。有人建议在我的数据帧上使用 IDXMAX 方法,但当我查看文档时,我无法真正弄清楚如何应用它。看起来它确实对此很有用......
我有一个数据框:
old = pd.DataFrame({'a FINSEC_SA' : [1,'NaN','NaN','NaN','NaN',1,'NaN'],
'b FINSEC_A' : ['NaN',1,'NaN','NaN','NaN','NaN','NaN'],
'c FINSEC_NO' : ['NaN','NaN',1,'NaN','NaN','NaN','NaN'],
'd FINSEC_D' : ['NaN','NaN','NaN',1,'NaN','NaN',1],
'e FINSEC_SD' : ['NaN','NaN','NaN','NaN',1,'NaN','NaN']})
我想以这样的数据框结束:
new = pd.DataFrame({'Financial Security':['a FINSEC_SA','b FINSEC_A',
'c FINSEC_NO','d FINSEC_D','e FINSEC_SD','a FINSEC_SA','d FINSEC_D']})
我只有大约 65,000 行数据,因此性能对我来说不是最重要的。我最感兴趣的是学习一种好的方法来做到这一点——希望它相当简单。如果 idxmax 能相当轻松地做到这一点,那就太好了。
请您参考如下方法:
idxmax 只能用于数字。所以首先,我们需要将 'NaN'(字符串)转换为 np.NaN(数值)。然后我们可以将每一列转换成一个数值系列:
old = old.replace('NaN', np.NaN)
old = old.apply(pd.to_numeric)
或者,您可以在一行中执行此操作:
old = old.apply(pd.to_numeric, errors='coerce')
最后,我们可以运行 idxmax。您所要做的就是指定轴。 axis=1获取每行1(最大值)的位置,axis=0获取每列1的位置
new = old.idxmax(axis=1)
您可以在一行中运行代码(如果在此之后您不需要旧的副本):
new = old.apply(pd.to_numeric, errors='coerce').idxmax(axis=1)
