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")