【问题标题】:Can we accumulate in a numpy array using values in a pandas dataframe columns in a vectorized way?我们可以以矢量化的方式使用 pandas 数据框列中的值在 numpy 数组中累积吗?
【发布时间】:2019-02-02 00:36:51
【问题描述】:

假设我们有以下 pandas 数据框:

test_df =  pd.DataFrame({'start':[1,2,3,4], 'end':[2,3,4,5] ,'signal':[1,2,3,4]},columns=['start','end','signal'])

我们可以用矢量化的方式更新一个 numpy 数组吗?

nparray = np.zeros(4)

使用下面的计算方法?

def compute(nparray,start,end,signal):
    nparray[start:end] += signal

现在,它给出了以下错误:

    nparray[start:end] += signal
TypeError: slice indices must be integers or None or have an __index__ method

【问题讨论】:

    标签: arrays pandas numpy dataframe vectorization


    【解决方案1】:

    第一次创建你的范围,然后将范围变成一个列表,然后问题变成unnesting 问题

    df['key']=[list(range(x,y))for x , y in zip(df.start,df.end)]
    unnesting(df,['key']).groupby('key').signal.sum()
    key
    1    1
    2    2
    3    3
    4    4
    Name: signal, dtype: int64
    
    unnesting(df, ['key']).groupby('key').signal.sum().values
    array([1, 2, 3, 4], dtype=int64)
    

    【讨论】:

    • 你是说这个功能吗?它是如何工作的? def unnesting(df, explode): idx=df.index.repeat(df[explode[0]].str.len()) df1=pd.concat([pd.DataFrame({x:np.concatenate(df[ x].values)} )for x in explode],axis=1) df1.index=idx return df1.join(df.drop(explode,1),how='left')
    • @burcak yes :-) 那就是函数
    • 假设test_df = pd.DataFrame({'start':[5,10], 'end':[7,20] ,'signal':[1,2]},columns=['start','end','signal']) 我们可以得到一个[1 1 0 0 0 2 2 2 2 2 2 2 2 2 2] 的numpy 数组而不是[1 1 2 2 2 2 2 2 2 2 2 2]
    • 另外,我还有一个问题,在这个取消嵌套的函数中,对于非常大的数据帧是有效的def unnesting(df, explode): idx=df.index.repeat(df[explode[0]].str.len()) df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1) df1.index=idx return df1.join(df.drop(explode,1),how='left')
    • @burcak unnesting(df,['key']).groupby('key').signal.sum().reindex(list(range(max(df.end)))).fillna(0)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2019-01-19
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多