Python 基于另一列替换列中的值
我正在尝试基于另一个现有列替换列中的值 这两列看起来像这样Python 基于另一列替换列中的值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在尝试基于另一个现有列替换列中的值 这两列看起来像这样 id_30 DeviceInfoShort Android SAMSUNG iOS iOS None Windows None None Mac MacOS Windows Windows None None id_30列的“无”未显示在图片中。 我想要的是对于id_30列中的所有“无”值,它将检查DeviceInfo Short中
id_30 DeviceInfoShort
Android SAMSUNG
iOS iOS
None Windows
None None
Mac MacOS
Windows Windows
None None
id_30列的“无”未显示在图片中。
我想要的是对于id_30列中的所有“无”值,它将检查DeviceInfo Short中的值是否为“Windows”,如果是,则将id_30中的“无”替换为“Windows”,否则为“Android”
下面的代码就是我所拥有的。它工作正常,但运行了10分钟。我想我可以在这里使用map/apply来加快速度……有没有更优雅的方式来使用熊猫呢
%%次
对于列中的r所有数据索引:
如果列车所有数据.loc[r,'id\u 30']=“无”:
如果train_all_data.loc[r,'DeviceInfo']=='Windows':
列车所有数据。loc[r,'id\U 30']='Windows'
其他:
train_all_data.loc[r,'id_30']='Android'
也许这会更快:
df['id_30'] = df.apply(lambda x: "Windows" if x.id_30 == "None" and x.DeviceInfoShort == "Windows" else "Android")
根据我的经验,使用apply()总是比使用Pandas/Numpy
循环快,其中
:
df['id_30']=df['id_30'],其中(
df['id_30'].notna(),
np.where(df['deviceinfo']='Windows','Windows','Android'))
您所说的是什么意思?如果是,请将id_30中的“无”替换为“Windows”,否则为“Android”
。如果没有,它就有一些价值。另外,请不要发布图片。复制粘贴示例数据帧,以便每个数据帧都可以复制。您是否有机会交换了id\u 30
和DeviceInfo Short
?只有在后者中,才有None
s.df['DeviceInfo Short']=np。其中((df['DeviceInfo Short']='None')、df['id_30']、df['DeviceInfo Short'])
@WillemVanOnsem我已经复制粘贴了另一组表。两列都有“无”值。不,不是apply
只对循环使用一个。它必须调用一个python函数(lambda
),这样调用就不能像矢量化计算那样被推入C。只要你调用python函数,矢量化就不存在了。这是我在评论中给出的更完整的版本。但是notna()
不会接受'None'
字符串,是吗?您需要测试是否等于'None'
事实上,如果有'None'字符串,df['id_30'].notna()
可以替换为(df['id_30'].notna())和(df['id_30']!='None')
非常感谢!这就是我想要的。虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请编辑您的答案,添加解释,并说明适用的限制和假设。
df['id_30'] = df.apply(lambda x: "Windows" if x.id_30 == "None" and x.DeviceInfoShort == "Windows" else "Android")