Python添加一个新列,并用另一列上的条件值填充

2024-04-25 00:08:21 发布

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

这里没有。在下面的数据框中,我想添加一个新列,该列的值依赖于col2中的值

df = pd.DataFrame({'col1': [1, 2, 10, 9], 'col2': [3, 4, 5, 6]})

   col1  col2
0     1     3
1     2     4
2    10     5
3     9     6

添加新列“col3”,以便-If:col2中的值为<;5,用“In”填充,>;5用'Out'填充,=5用5填充。所需输出如下

   col1  col2 col3
0     1     3   In
1     2     4   In
2    10     5    5
3     9     6  Out

我已经能够使用for循环来实现这一点,但在大型数据集上这似乎并不有效。有什么简单的方法吗


Tags: 数据方法inltgtdataframedffor
2条回答

我找到了3种方法:使用np.wherepd.locpd.apply(以及@OO7here的建议)

def using_where(df):
    df['col3'] = np.where(df['col2']>5, 'Out', np.where(df['col2']<5, 'In', 5))
    return df

def using_apply(df):
    df['col3'] = df['col2'].apply(lambda x: 5 if x == 5 else ('In' if x < 5 else 'Out'))
    return df

def using_loc(df):
    df['col3'] = 5
    df.loc[df['col2']>5, 'col3'] = 'Out'
    df.loc[df['col2']<5, 'col3'] = 'In'
    return df

我对它们进行了分析,根据{}的{}不同,它们的表现似乎也不同:

size = 10**4
df = pd.DataFrame({'col1': np.random.randint(0, 10, size), 'col2': np.random.randint(0, 10, size)})
%timeit using_where(df)
%timeit using_apply(df)
%timeit using_loc(df)

使用size = 10**4输出:

1000 loops, best of 3: 1.97 ms per loop
100 loops, best of 3: 2.11 ms per loop
100 loops, best of 3: 4.14 ms per loop

使用size = 10**5输出:

100 loops, best of 3: 18.6 ms per loop
100 loops, best of 3: 17.5 ms per loop
100 loops, best of 3: 11.9 ms per loop

总之,我想说,您应该亲自尝试这个评测,并为您的应用程序选择最快的方法。 希望这有帮助

试试这个

df = pd.DataFrame({'col1': [1, 2,10,9], 'col2': [3, 4,5,6]})
df['col3'] = df['col2'].apply(lambda x: '5' if x == 5 else ('In' if x < 5 else "Out"))
df

enter image description here

相关问题 更多 >