基于另一列替换列中的值

2024-04-19 17:00:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试替换基于另一个现有列的列中的值。你知道吗

这两列是这样的

id_30       DeviceInfoShort

Android     SAMSUNG
iOS         iOS
None        Windows
None        None
Mac         MacOS
Windows     Windows
None        None

id\ 30列有图片中未显示的“无”。 我想要的是对于id\u30列中的所有“None”值,它将检查DeviceInfoShort中的值是否为“Windows”,如果是,将id\u30中的“None”替换为“Windows”,否则为“Android”

下面的代码就是我所拥有的。它运行得很好,但运行了10分钟。我想我可以在这里使用map/apply来加快速度…有没有更优雅的方法来使用熊猫呢?你知道吗

%%time
for r in train_all_data.index:
    if train_all_data.loc[r, 'id_30'] == 'None':
        if train_all_data.loc[r, 'DeviceInfoShort'] == 'Windows':
            train_all_data.loc[r, 'id_30'] = 'Windows'
        else:
            train_all_data.loc[r, 'id_30'] = 'Android'

Tags: noneiddataifwindowsmactrainmacos
3条回答

也许这会更快:

df['id_30'] = df.apply(lambda x: "Windows" if x.id_30 == "None" and x.DeviceInfoShort == "Windows" else "Android")

根据我的经验,使用apply()总是比循环使用要快

使用Pandas/Numpywhere

df['id_30'] = df['id_30'].where(
    df['id_30'].notna(), 
    np.where(df['DeviceInfoShort'] == 'Windows', 'Windows', 'Android'))
temp = train_all_data[train_all_data['id_30'] == 'None']
train_all_data.loc[temp, 'id_30'] = 'Andorid'
temp1 = train_all_data[(train_all_data['id_30'] == 'None') & (train_all_data['DeviceInfoShort'] == 'Windows')]
train_all_data.loc[temp1, 'id_30'] = 'Windows'

相关问题 更多 >