[英]Pandas - Dataframe - Conditional add
我想在我的数据框中添加一个新列。 我有一个事件列表,如果其中任何一个与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
这样做最简单的方法是什么? 哪个最好?
使用filter
+ any
由于所有非零整数是Truthy在Python,要求any
在正确的面膜你的数据帧结果直接。 既然你想要一个整数输出,我们可以使用一个内存使用效率view
以查看布尔掩码为整数类型。
df.filter(like="Event").any(1).view('i1')
0 1
1 1
2 0
3 1
dtype: int8
DataFrame.filter
, eq
和any
首先,我们filter
以Event
或Other
开头的列。 然后我们检查是否有any
行eq
(等于) 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
或使用:
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
假设您的数据框存储在名为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
所有行。 通常,使用布尔数组进行切片是操作数据帧的最有效方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.