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 

这种方法可以非常强大,当你有许多ifelsetypes的语句(即许多独特的值来取代)。

当然你也可以这样做:

 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