大熊猫中的地图数据

问题描述 投票:0回答:2

我有以下数据。

from datetime import date, timedelta
import pandas as pd
import numpy as np
sdate = date(2019,1,1)   # start date
edate = date(2019,1,7)   # end date -6days

required_dates = pd.date_range(sdate,edate-timedelta(days=1),freq='d')
# initialize list of lists 
data = [['2019-01-01', 1000,101], ['2019-01-03', 1000,201] ,['2019-01-02', 1500,301], 
        ['2019-01-02', 1400,101],['2019-01-04', 1500,201],['2019-01-01', 2000,201],
        ['2019-01-04', 2000,101],['2019-01-04', 1400,301],['2019-01-05', 1400,301],['2019-01-05', 1400,301]]
# Create the pandas DataFrame 
df1 = pd.DataFrame(data, columns = ['OnlyDate', 'TBID','UserID'])
df1=df1[['OnlyDate','UserID','TBID']]
df1.sort_values(by=['UserID','TBID'],inplace=True)
df1.reset_index(inplace=True,drop=True)
df1


    OnlyDate    UserID  TBID
0   2019-01-01  101 1000
1   2019-01-02  101 1400
2   2019-01-04  101 2000
3   2019-01-03  201 1000
4   2019-01-04  201 1500
5   2019-01-01  201 2000
6   2019-01-04  301 1400
7   2019-01-05  301 1400
8   2019-01-05  301 1400
9   2019-01-02  301 1500 

我想得到的是每个UserID的outputDataFrame,如下图。

USERID = 101的期望输出。

ActualValues    TBID  UserID
    OnlyDate        
    2019-01-01  1   1000   101
    2019-01-02  0   1000   101
    2019-01-03  0   1000   101
    2019-01-04  0   1000   101
    2019-01-05  0   1000   101

    2019-01-01  0   1400   101
    2019-01-02  1   1400   101
    2019-01-03  0   1400   101
    2019-01-04  0   1400   101
    2019-01-05  0   1400   101

    2019-01-01  0   1500   101
    2019-01-02  0   1500   101
    2019-01-03  0   1500   101
    2019-01-04  0   1500   101
    2019-01-05  0   1500   101

    2019-01-01  0   2000   101
    2019-01-02  0   2000   101
    2019-01-03  0   2000   101
    2019-01-04  1   2000   101
    2019-01-05  0   2000   101

for USERID = 301

    2019-01-01  0   1000   301
    2019-01-02  0   1000   301
    2019-01-03  0   1000   301
    2019-01-04  0   1000   301
    2019-01-05  0   1000   301

    2019-01-01  0   1400   301
    2019-01-02  0   1400   301
    2019-01-03  0   1400   301
    2019-01-04  1   1400   301
    2019-01-05  2   1400   301

    2019-01-01  0   1500   301
    2019-01-02  1   1500   301
    2019-01-03  0   1500   301
    2019-01-04  0   1500   301
    2019-01-05  0   1500   301

    2019-01-01  0   2000   301
    2019-01-02  0   2000   301
    2019-01-03  0   2000   301
    2019-01-04  0   2000   301
    2019-01-05  0   2000   301

我试过这个是不想要的。

x= pd.get_dummies(data=df1, columns=['TBID']).groupby(['OnlyDate','UserID']).sum()
x


   
            TBID_1000   TBID_1400   TBID_1500   TBID_2000
OnlyDate    UserID              
2019-01-01  101 1   0   0   0
            201 0   0   0   1
2019-01-02  101 0   1   0   0
            301 0   0   1   0
2019-01-03  201 1   0   0   0
2019-01-04  101 0   0   0   1
            201 0   0   1   0
            301 0   1   0   0
2019-01-05  301 0   2   0   0

我如何才能得到这样的输出?

python pandas pandas-groupby
2个回答
1
投票

基本思路是按大小进行分组。妨害是将缺失的索引用0值填充,可以通过以下方式实现。reindex 或数据重塑。下面是重塑的方法。

(df1.groupby(['OnlyDate','UserID','TBID'])
    .size()
    .unstack('OnlyDate', fill_value=0) 
    .unstack('UserID', fill_value=0)
    .unstack()
    .reset_index(name='count'))

2
投票

使用 GroupBy.sizeSeries.reindex:

df = df1.groupby(['OnlyDate','UserID','TBID']).size()
mux = pd.MultiIndex.from_product(df.index.levels)
df = df.reindex(mux, fill_value=0).sort_index(level=[1,2,0]).reset_index(name='count')

print (df.head(10))
     OnlyDate  UserID  TBID  count
0  2019-01-01     101  1000      1
1  2019-01-02     101  1000      0
2  2019-01-03     101  1000      0
3  2019-01-04     101  1000      0
4  2019-01-05     101  1000      0
5  2019-01-01     101  1400      0
6  2019-01-02     101  1400      1
7  2019-01-03     101  1400      0
8  2019-01-04     101  1400      0
9  2019-01-05     101  1400      0
© www.soinside.com 2019 - 2024. All rights reserved.