pandas:使用if-else填充新列

时间:2015-03-19 19:57:07

标签: python pandas if-statement dataframe

我有一个像这样的DataFrame:

col1       col2      
  1          0
  0          1
  0          0
  0          0
  3          3
  2          0
  0          4

如果col2是>我想添加一个1的列。否则为0或0。如果我使用R,我会做

之类的事情
df1[,'col3'] <- ifelse(df1$col2 > 0, 1, 0)

我如何在python / pandas中执行此操作?

2 个答案:

答案 0 :(得分:8)

您可以将布尔系列df.col2 > 0转换为整数系列(True变为1False变为0):

df['col3'] = (df.col2 > 0).astype('int')

(要创建新列,只需将其命名并将其指定给与DataFrame长度相同的Series,数组或列表。)

这会产生col3

   col2  col3
0     0     0
1     1     1
2     0     0
3     0     0
4     3     1
5     0     0
6     4     1

创建列的另一种方法可能是使用np.where,它允许您为true或false值指定值,并且可能更接近R函数ifelse的语法。例如:

>>> np.where(df['col2'] > 0, 4, -1)
array([-1,  4, -1, -1,  4, -1,  4])

答案 1 :(得分:1)

我假设您正在使用Pandas(因为&#39; df&#39;表示法)。如果是这样,您可以使用.gt(大于)将col3与零进行比较,为col3指定一个布尔标志。将结果乘以1会将布尔标志转换为1和0。

df1 = pd.DataFrame({'col1': [1, 0, 0, 0, 3, 2, 0], 
                    'col2': [0, 1, 0, 0, 3, 0, 4]})

df1['col3'] = df1.col2.gt(0) * 1

>>> df1
Out[70]: 
   col1  col2  col3
0     1     0     0
1     0     1     1
2     0     0     0
3     0     0     0
4     3     3     1
5     2     0     0
6     0     4     1

您也可以使用lambda表达式来获得相同的结果,但我相信上面的方法对于您给出的示例更简单。

df1['col3'] = df1['col2'].apply(lambda x: 1 if x > 0 else 0)