df['color'] = ['red' if x == 'Z' else 'green' for x in df['Set']]
%timeit测试:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
%timeit df['color'] = ['red' if x == 'Z' else 'green' for x in df['Set']]
%timeit df['color'] = np.where(df['Set']=='Z', 'green', 'red')
%timeit df['color'] = df.Set.map( lambda x: 'red' if x == 'Z' else 'green')
1000 loops, best of 3: 239 µs per loop
1000 loops, best of 3: 523 µs per loop
1000 loops, best of 3: 263 µs per loop
# First create a dictionary of manually stored values
color_dict = {'Z':'red'}
# Second, build a dictionary of "other" values
color_dict_other = {x:'green' for x in df['Set'].unique() if x not in color_dict.keys()}
# Next, merge the two
color_dict.update(color_dict_other)
# Finally, map it to your column
df['color'] = df['Set'].map(color_dict)
10条答案
按热度按时间nx7onnlm1#
如果您只有两个选择:
例如
产量
如果您有两种以上的情况,请使用
np.select
. 例如,如果你想color
成为yellow
什么时候(df['Set'] == 'Z') & (df['Type'] == 'A')
否则blue
什么时候(df['Set'] == 'Z') & (df['Type'] == 'B')
否则purple
什么时候(df['Type'] == 'B')
否则black
,然后使用
产生
ckocjqey2#
列表理解是有条件地创建另一列的另一种方法。如果使用列中的对象数据类型,如示例中所示,列表理解通常优于大多数其他方法。
示例列表理解:
%timeit测试:
zzzyeukh3#
实现这一目标的另一种方法是
ecfsfe2w4#
下面是另一种剥猫皮的方法,使用字典将新值Map到列表中的键:
它看起来像什么:
当您有许多问题时,这种方法可能非常强大
ifelse
-键入要生成的语句(即许多要替换的唯一值)。当然,你也可以这样做:
但这一方法的速度是传统方法的三倍多
apply
从上面接近,在我的机器上。你也可以这样做,使用
dict.get
:nnsrf1az5#
下面的方法比这里计时的方法慢,但是我们可以基于多个列的内容计算额外的列,并且可以为额外的列计算两个以上的值。
仅使用“设置”列的简单示例:
考虑更多颜色和更多列的示例:
编辑(2019年6月21日):使用plydata
也可以使用plydata来做这类事情(这似乎比使用plydata更慢)
assign
及apply
(尽管如此)。简单的
if_else
:嵌套
if_else
:zyfwsgd66#
您只需使用强大的
.loc
方法,并根据需要使用一个或多个条件(使用pandas=1.0.5进行测试)。代码摘要:
说明:
添加“颜色”列并将所有值设置为“红色”
应用您的单一条件:
或多个条件(如果需要):
您可以在此处阅读pandas逻辑运算符和条件选择:pandas中用于布尔索引的逻辑运算符
dohp0rv57#
一班轮
.apply()
方法如下:之后,
df
数据框如下所示:ijxebb2r8#
你可以使用Pandas的方法
where
及mask
:或
输出:
x6492ojm9#
如果您使用的是海量数据,最好采用记忆方法:
当您有许多重复的值时,这种方法将是最快的。我的一般经验法则是在以下情况下进行记忆:
data_size
>10**4
&n_distinct
<data_size/4
e、 x.在一个案例中,用2500个或更少的不同值记录10000行。lo8azlld10#
如果只有两种选择,请使用
np.where()
```df = pd.DataFrame({'A':range(3)})
df['B'] = np.where(df.A>2, 'yes', 'no')
arr = pd.DataFrame({'A':list('abc'), 'B':range(3), 'C':range(3,6), 'D':range(6, 9)})
A B C D
0 a 0 3 6
1 b 1 4 7
2 c 2 5 8
最后是arr