Pandas - 数据框 - 条件添加

4

我想在我的数据框中添加一列。我有一个事件列表,如果其中任何一个与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个回答

2

使用 filter + any

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


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

0    1
1    1
2    0
3    1
dtype: int8

几乎做好了。现在不会出错了。但由于某种原因它将所有值都设置为0。 - Jesper Mølgaard

2

使用 DataFrame.filter, eqany

首先,我们使用DataFrame.filter筛选以EventOther开头的列。然后,我们检查是否有任何一行与1相等:

最初的回答

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

   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

我有一个行列表: event_list = ("event_1","event_2","event_2","event_3","other") 当我将 like='Event 替换为 event list 时,会出现以下错误: ValueError: cannot reindex from a duplicate axis - Jesper Mølgaard
请查看我的编辑,其中还包括检查“其他”列。@JesperMølgaard - Erfan

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 被称为 掩码,它返回一个布尔数组(一个由 TrueFalse 值填充的向量)。它选择所有返回值为 True 的行。通常,使用布尔数组切片是操作数据框最有效的方法。

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

看起来实现起来可能很容易,但对我来说却引发了一个 TypeError: 无法将 bool 转换为 numpy.ndarray。我的行列表在:event_list = ("event_1","event_2","event_2","event_3","other"),我尝试用 ['Event_1', 'Event_2', 'Event_3'] 替换 event_list - Jesper Mølgaard
@JesperMølgaard 添加了其他内容 - U13-Forward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接