Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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_Dataframe_Argmax - Fatal编程技术网

Python 在数据帧的每一行中查找第一个和最后一个非零列

Python 在数据帧的每一行中查找第一个和最后一个非零列,python,pandas,dataframe,argmax,Python,Pandas,Dataframe,Argmax,我在Name和Date视图中有一个数据框,其权重值以单元格为单位: Name Jan17 Jun18 Dec18 Apr19 count Nick 0 1.7 3.7 0 2 Jack 0 0 2.8 3.5 2 Fox 0 1.7 0 0 1 Rex 1.0 0

我在
Name
Date
视图中有一个数据框,其权重值以单元格为单位:

Name        Jan17  Jun18  Dec18    Apr19  count 
Nick         0      1.7     3.7      0     2
Jack         0       0      2.8     3.5    2       
Fox          0      1.7      0       0     1
Rex          1.0     0      3.0     4.2    3
Snack        0       0      2.8     4.4    2
Yosee        0       0       0      4.3    1 
Petty        0.5    1.3     2.8     3.5    4 
Start
Finish
应参照下一个定义添加到数据帧中:

  • Start
    从2017年1月开始的行中第一个非零值 列至19年4月的
  • Finish
    中的第一个非零值 序列号:19年4月至17日
  • 此外,如果行中只有一个非零值,则
    Start
    Finish
    是相同的

    为了找到第行中的第一个非零元素,我尝试了
    data[col].keys,np.argmax()
    ,它可以正常工作

    date\u col\u list=['Jan17'、'Jun18'、'Dec18'、'Apr19']

    data['Start']=数据[日期列].键([np.argmax(数据[日期列].值!=0,轴=1)]

    结果是:

    Name        Jan17  Jun18  Dec18    Apr19  count   Start 
    Nick         0      1.7     3.7      0     2      Jun18        
    Jack         0       0      2.8     3.5    2      Dec18           
    Fox          0      1.7      0       0     1      Jun18    
    Rex          1.0     0      3.0     4.2    3      Jan18    
    Snack        0       0      2.8     4.4    2      Dec18    
    Yosee        0       0       0      4.3    1      Apr19     
    Petty        0.5    1.3     2.8     3.5    4      Jan17
    
    要检测我尝试使用的
    Finish
    列的值:
    np.沿_轴应用_
    如下:
    def func_X(i):
    返回np.argmax(np.where(i!=0))

    np.沿轴应用(func1d=func\ux,轴=1,arr=data[date\u col\u list]。值)

    结果是错误:
    “tuple”对象没有属性“argmax”

    预期数据帧为:

    Name        Jan17  Jun18  Dec18    Apr19  count   Start  Finish
    Nick         0      1.7     3.7      0     2      Jun18   Dec18     
    Jack         0       0      2.8     3.5    2      Dec18   Apr19        
    Fox          0      1.7      0       0     1      Jun18   Jun18 
    Rex          1.0     0      3.0     4.2    3      Jan18   Apr19 
    Snack        0       0      2.8     4.4    2      Dec18   Apr19 
    Yosee        0       0       0      4.3    1      Apr19   Apr19  
    Petty        0.5    1.3     2.8     3.5    4      Jan17   Apr19  
    
    如何在从最后一列(
    Apr19
    )到第一列(
    Jan17
    )的方向上参照非零值找到
    Finish

    idxmax
    删除不相关的列,然后首先在列上使用
    idxmax
    ,然后在反向列上分别查找第一个和最后一个有效索引。

    first\u valid\u index
    last\u valid\u index

    stack
    然后
    groupby

    在您的情况下,尝试使用
    dot

    s=df.loc[:,'Jan17':'Apr19'].ne(0)
    s=s.dot(s.columns+',').str[:-1].str.split(',')
    s.str[0],s.str[-1]
    Out[899]: 
    (0    Jun18
     1    Dec18
     2    Jun18
     3    Jan17
     4    Dec18
     5    Apr19
     6    Jan17
     dtype: object, 0    Dec18
     1    Apr19
     2    Jun18
     3    Apr19
     4    Apr19
     5    Apr19
     6    Apr19
     dtype: object)
     #df['Start'],df['End']=s.str[0],s.str[-1]
    

    在基础
    数组上使用
    cumsum

    m = df.drop(['Name', 'count'], axis=1)
    u = m.to_numpy().cumsum(1)
    
    start = (u!=0).argmax(1)
    end = u.argmax(1)
    
    df.assign(start=m.columns[start], end=m.columns[end])
    

    d = df.mask(df == 0).drop(['Name', 'count'], 1)
    def fl(s): return s.xs(s.name).index[[0, -1]]
    s, f = d.stack().groupby(level=0).apply(fl).str
    df.assign(Start=s, Finish=f)
    
        Name  Jan17  Jun18  Dec18  Apr19  count  Start Finish
    0   Nick    0.0    1.7    3.7    0.0      2  Jun18  Dec18
    1   Jack    0.0    0.0    2.8    3.5      2  Dec18  Apr19
    2    Fox    0.0    1.7    0.0    0.0      1  Jun18  Jun18
    3    Rex    1.0    0.0    3.0    4.2      3  Jan17  Apr19
    4  Snack    0.0    0.0    2.8    4.4      2  Dec18  Apr19
    5  Yosee    0.0    0.0    0.0    4.3      1  Apr19  Apr19
    6  Petty    0.5    1.3    2.8    3.5      4  Jan17  Apr19
    
    s=df.loc[:,'Jan17':'Apr19'].ne(0)
    s=s.dot(s.columns+',').str[:-1].str.split(',')
    s.str[0],s.str[-1]
    Out[899]: 
    (0    Jun18
     1    Dec18
     2    Jun18
     3    Jan17
     4    Dec18
     5    Apr19
     6    Jan17
     dtype: object, 0    Dec18
     1    Apr19
     2    Jun18
     3    Apr19
     4    Apr19
     5    Apr19
     6    Apr19
     dtype: object)
     #df['Start'],df['End']=s.str[0],s.str[-1]
    
    m = df.drop(['Name', 'count'], axis=1)
    u = m.to_numpy().cumsum(1)
    
    start = (u!=0).argmax(1)
    end = u.argmax(1)
    
    df.assign(start=m.columns[start], end=m.columns[end])
    
        Name  Jan17  Jun18  Dec18  Apr19  count  start    end
    0   Nick    0.0    1.7    3.7    0.0      2  Jun18  Dec18
    1   Jack    0.0    0.0    2.8    3.5      2  Dec18  Apr19
    2    Fox    0.0    1.7    0.0    0.0      1  Jun18  Jun18
    3    Rex    1.0    0.0    3.0    4.2      3  Jan17  Apr19
    4  Snack    0.0    0.0    2.8    4.4      2  Dec18  Apr19
    5  Yosee    0.0    0.0    0.0    4.3      1  Apr19  Apr19
    6  Petty    0.5    1.3    2.8    3.5      4  Jan17  Apr19