我想在数据框中添加新列。我有一个事件列表,如果其中任何一个与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
最简单的方法是什么?最好是什么?
答案 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.filter
,eq
和any
首先,我们filter
以Event
或Other
开头的列。然后,我们检查行中的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
我在这里所做的是:
["Event_1","Event_2","Event_3","Other"]
中各列的按行总和大于1的所有行。"Conditional_row"
用值1更新。代码df[["Event_1","Event_2","Event_3","Other"]].sum(axis=1) > 0
被称为mask
,它返回一个布尔数组(一个由True
和False
值填充的向量)。它选择返回值为True
的所有行。通常,使用布尔数组切片是处理数据帧的最有效方法。