pandas有条件地创build一个系列/数据框的列
我有一个数据框如下所示:
Type Set 1 AZ 2 BZ 3 BX 4 CY
我想添加另一列的数据框(或生成一系列)的长度相同的数据框(=相同数量的logging/行)如果设置=“Z”设置为绿色,如果设置=否则设置为“红色” 。
什么是最好的方法来做到这一点?
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
例如,
import pandas as pd import numpy as np df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')}) df['color'] = np.where(df['Set']=='Z', 'green', 'red') print(df)
产量
Set Type color 0 ZA green 1 ZB green 2 XB red 3 YC red
如果你有更多的条件,然后使用np.select
。 例如,如果你想要颜色
-
(df['Set'] == 'Z') & (df['Type'] == 'A')
-
(df['Set'] == 'Z') & (df['Type'] == 'B')
-
(df['Type'] == 'B')
否则为purple
- 否则
black
,
然后使用
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')}) conditions = [ (df['Set'] == 'Z') & (df['Type'] == 'A'), (df['Set'] == 'Z') & (df['Type'] == 'B'), (df['Type'] == 'B')] choices = ['yellow', 'blue', 'purple'] df['color'] = np.select(conditions, choices, default='black') print(df)
这产生了
Set Type color 0 ZA yellow 1 ZB blue 2 XB purple 3 YC black
列表理解是另一种有条件创build另一列的方法。 如果您正在使用列中的对象dtypes(如在您的示例中),那么列表parsing通常会胜过大多数其他方法。
示例列表理解:
df['color'] = ['red' if x == 'Z' else 'green' for x in df['Set']]
%timeittesting:
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
这可以实现的另一种方式是
df['color'] = df.Set.map( lambda x: 'red' if x == 'Z' else 'green')
这里有另外一种方法来清理这只猫,使用字典将新值映射到列表中的键上:
def map_values(row, values_dict): return values_dict[row] values_dict = {'A': 1, 'B': 2, 'C': 3, 'D': 4} df = pd.DataFrame({'INDICATOR': ['A', 'B', 'C', 'D'], 'VALUE': [10, 9, 8, 7]}) df['NEW_VALUE'] = df['INDICATOR'].apply(map_values, args = (values_dict,))
它是什么样的:
df Out[2]: INDICATOR VALUE NEW_VALUE 0 A 10 1 1 B 9 2 2 C 8 3 3 D 7 4
这种方法可以非常强大,当你有许多ifelse
types的语句(即许多独特的值来取代)。
当然你也可以这样做:
df['NEW_VALUE'] = df['INDICATOR'].map(values_dict)
但是这个方法比我上面apply
方法慢了三倍。
你也可以使用dict.get
做到这一点:
df['NEW_VALUE'] = [values_dict.get(v, None) for v in df['INDICATOR']]
下面的方法比在这里定义的方法要慢,但是我们可以根据多个列的内容计算额外的列,并且可以为额外的列计算两个以上的值。
仅使用“设置”列的简单示例:
def set_color(row): if row["Set"] == "Z": return "red" else: return "green" df = df.assign(color=df.apply(set_color, axis=1)) print(df)
Set Type color 0 ZA red 1 ZB red 2 XB green 3 YC green
考虑更多颜色和更多列的示例:
def set_color(row): if row["Set"] == "Z": return "red" elif row["Type"] == "C": return "blue" else: return "green" df = df.assign(color=df.apply(set_color, axis=1)) print(df)
Set Type color 0 ZA red 1 ZB red 2 XB green 3 YC blue