熊猫-数据框-有条件添加

时间:2019-08-14 13:14:29

标签: python pandas conditional-statements

我想在数据框中添加新列。我有一个事件列表,如果其中任何一个与0不同,则新列中的行的值应为1。

我认为它应该非常简单,但是我对python还是相当陌生。

数据框如下所示:

df = pd.DataFrame({"ID":[1,1,2,3],"Date":["01/01/2019","01/01/2019","02/01/2019","02/01/2019"],"Event_1":[1,0,0,0],"Event_2":[1,0,0,1],"Event_3":[0,1,0,1],"Other":[0,0,0,1]})

print(df)
ID    Date         Event_1 Event_2 Event_3 Other
1     01/01/2019   1       1       0       0
1     01/01/2019   0       0       1       0
2     02/01/2019   0       0       0       0
3     02/01/2019   0       1       1       1

应该看起来像这样:

ID    Date         Event_1 Event_2 Event_3 Other Conditional_row
1     01/01/2019   1       1       0       0     1
1     01/01/2019   0       0       1       0     1
2     02/01/2019   0       0       0       0     0
3     02/01/2019   0       1       1       1     1

最简单的方法是什么?最好是什么?

4 个答案:

答案 0 :(得分:2)

使用filter + any

由于Python中所有非零整数都是 Truthy ,因此直接在DataFrame上调用any会得到正确的掩码。由于您需要整数输出,因此我们可以使用内存有效的view来将布尔型掩码视为整数类型。


df.filter(like="Event").any(1).view('i1')

0    1
1    1
2    0
3    1
dtype: int8

答案 1 :(得分:2)

使用DataFrame.filtereqany

首先,我们filterEventOther开头的列。然后,我们检查行中的any是否等于eq的{​​{1}}:

1
df['Conditional_row'] = df.filter(regex="^Event|^Other").eq(1).any(axis=1).astype(int)

答案 2 :(得分:1)

或使用:

df['Conditional_row'] = df[['Event_1', 'Event_2', 'Event_3', 'Other']].ne(0).any(1).astype(int)

现在:

print(df)

输出:

   ID        Date  Event_1  Event_2  Event_3  Conditional_row
0   1  01/01/2019        1        1        0                1
1   1  01/01/2019        0        0        1                1
2   2  02/01/2019        0        0        0                0
3   3  02/01/2019        0        1        1                1

答案 3 :(得分:1)

假设您的数据帧存储在名为df的对象中。我相信这是最有效的方法:

df["Conditional_row"] = 0
df.loc[df[["Event_1","Event_2","Event_3","Other"]].sum(axis=1) > 0, "Conditional_row"] = 1

输出看起来像这样:

print(df)
   ID        Date  Event_1  Event_2  Event_3  Other  Conditional_row
0   1  01/01/2019        1        1        0      0                1
1   1  01/01/2019        0        0        1      0                1
2   2  02/01/2019        0        0        0      0                0
3   3  02/01/2019        0        1        1      1                1

我在这里所做的是:

  1. 我创建了一个新的填充有零的列。
  2. 我选择了列表["Event_1","Event_2","Event_3","Other"]中各列的按行总和大于1的所有行。
  3. 满足该条件的行的列"Conditional_row"用值1更新。

代码df[["Event_1","Event_2","Event_3","Other"]].sum(axis=1) > 0被称为mask,它返回一个布尔数组(一个由TrueFalse值填充的向量)。它选择返回值为True的所有行。通常,使用布尔数组切片是处理数据帧的最有效方法。