Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-数据帧-条件添加_Python_Pandas_Conditional Statements - Fatal编程技术网

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

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