Python 熊猫-数据帧-条件添加
我想在数据框中添加一个新列。我有一个事件列表,如果其中任何一个与0不同,则新列中的行的值应为1 我认为它应该非常简单,但我对python还是相当陌生的 数据帧如下所示:Python 熊猫-数据帧-条件添加,python,pandas,conditional-statements,Python,Pandas,Conditional Statements,我想在数据框中添加一个新列。我有一个事件列表,如果其中任何一个与0不同,则新列中的行的值应为1 我认为它应该非常简单,但我对python还是相当陌生的 数据帧如下所示: df=pd.DataFrame({“ID”:[1,1,2,3],“Date”:[“2019年1月1日”,“2019年1月1日”,“2019年1月2日”,“2019年1月1日”,“2019年1月2日],“Event_1”:[1,0,0,0],“Event_3”:[0,1,0,1],“其他”:[0,0,0,1]) 打印(df) ID
df=pd.DataFrame({“ID”:[1,1,2,3],“Date”:[“2019年1月1日”,“2019年1月1日”,“2019年1月2日”,“2019年1月1日”,“2019年1月2日],“Event_1”:[1,0,0,0],“Event_3”:[0,1,0,1],“其他”:[0,0,0,1])
打印(df)
ID日期事件\u 1事件\u 2事件\u 3其他
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日期事件\u 1事件\u 2事件\u 3其他条件行
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
最简单的方法是什么?什么是最好的?使用
过滤器+任何
由于所有非零整数在Python中都是真实的,因此直接在数据帧上调用any
,将得到正确的掩码。由于您需要整数输出,我们可以使用内存有效的视图
将布尔掩码视为整数类型
使用DataFrame.filter
、eq
和any
首先,我们过滤以事件
或其他
开头的列。然后我们检查行中是否有任何行是eq
(相等)到1
:
df['Conditional_row'] = df.filter(regex="^Event|^Other").eq(1).any(axis=1).astype(int)
或使用:
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[“条件行”]=0
df.loc[df[“事件1”、“事件2”、“事件3”、“其他”]。总和(轴=1)>0,“条件行”]=1
输出如下所示:
打印(df)
ID日期事件1事件2事件3其他条件行
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的所有行
满足该条件的行的列“Conditional_row”
用值1更新
代码df[[“Event_1”、“Event_2”、“Event_3”、“Other”].sum(axis=1)>0
称为mask
,它返回一个布尔数组(用True
和False
值填充的向量)。它选择返回值为True
的所有行。通常,使用布尔数组进行切片是操作数据帧的最有效方式。我在中有一个行列表:event\u list=(“event\u 1”、“event\u 2”、“event\u 2”、“event\u 3”、“other”)
当我用like='Event
替换事件列表
时,我得到:ValueError:无法从重复轴重新编制索引
请参见我的编辑,其中包括检查列其他
@JesperMølgaardIt看起来很容易实现,但对我来说,这会引发一个类型错误:无法将bool转换为numpy.ndarray
我的行列表位于:event_list=(“event_1”,“event_2”,“event_2”,“event_3”,“other”)
并且我尝试替换['event_1','event_2','event_3']对于事件列表
@JesperMølgaard添加了Other,使其几乎正常工作。它现在不会引发错误。但出于某种原因,它将所有值都设置为0
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