bugfix> python > 投稿

次のようなデータフレームがあります(ただし、私のものは非常に大きいです)。

user1      user2   day   hour  quantity
-------------------------------------
Alice      Bob      1     12     250
Alice      Bob      1     13     250
Bob        Carol    1     10     20
Alice      Bob      4     1      600
.
.
.

...その後、次のgroupbyと集計を取得すると仮定します(by user1user2 および day ):

user1      user2   day   quantity
---------------------
Alice      Bob      1      500
                    4      600
Bob        Carol    1      20
                    3      100

どこ1日は0〜364(365日)になります。私が望むのは、すべての日における各ユーザーのカウントの四分位範囲(および中央値)です-ゼロはカウントされません

除外されたすべての日に明示的なゼロがあれば、人生はもっと楽だっただろう:

user1    user2    day   quantity
---------------------
Alice    Bob      1      500
                  2      0
                  3      0
                  4      600
.....
Bob      Carol    1      20
                  2      0
                  3      100
...

...それで、 df.reset_index().agg({'quantity':scipy.stats.iqr}) ができるからしかし、私は非常に大きなデータフレーム(上記の例はダミーのもの)で作業しており、ゼロでのインデックス再作成は不可能です。

私はそれを行う方法を考えています:365日があることを知っているので、残りの数字をゼロで埋める必要があります:

Alice-Bob: [500,600] + (365-2) * [0]

scipy.stats.iqr を取得(および中央値)。ただし、これにはすべての user1-user2 を反復処理する必要がありますペア。経験から、それは多くの時間がかかります。

これに対するベクトル化されたソリューションはありますか?私も中央値を取得する必要があり、同じアプローチが当てはまると思います。

回答 1 件
  • データフレームに配置せずにゼロを活用するには、次のようなものを使用できます。

    test = df.groupby(['user1', 'user2', 'day'])['quantity'].mean().reset_index()\
             .groupby(['user1', 'user2'])\
             .agg({'day': lambda x: tuple(x), 'quantity': lambda x: tuple(x)})\
             .reset_index()
    def med_from_tuple(row):
        # starts with everything zero, and replaces some with the nonzero values in the dataframe
        z = np.zeros(365)
        np.put(z, row['day'], row['quantity'])
        return np.median(z)
    test['example'] = test.apply(lambda x: med_from_tuple(x), axis=1)
    
    

    これにより、データフレームにゼロがあるかのように数量の中央値が作成されます。

    test
    #   user1  user2     day    quantity   example
    #0  Alice    Bob  (1, 4)  (250, 600)       0.0
    #1    Bob  Carol    (1,)       (20,)       0.0
    
    

あなたの答え