在多个pandas列中重新采样和分组

bmp9r5qi  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(113)

嗨我想转换我的 Dataframe 从

df = pd.DataFrame({
        'date': [
           '2019-08-01', '2019-12-01',
           '2019-23-01', '2019-15-01',
           '2020-26-02', '2020-10-10',
           '2020-08-10', '2021-01-04'
        ],
        'loc': [
           'axp','axp', 'axp', 'axp',
           'axe', 'axp', 'axp', 'axe'
        ],
        'category': [
           'domestic', 'domestic', 'domestic', 
           'domestic',
           'wild', 'domestic', 'domestic', 'wild'
        ],
        'status': [
           'found', 'found', 'not found', 'found',
           'found', 'found', 'found', 'not found'
        ]
    })

转换为这种格式,其中每个loc都减少到每月和每年相关categorystatus的计数
| 月地点年|n_国内|n_wild| n_发现|n_未找到|
| --------------|--------------|--------------|--------------|--------------|
| 2019 - 01 - 21|四|0| 3| 1|
| 2020年02月02日|0| 1| 1| 0|
| 2020年10月10日|2| 0| 2| 0|
| 2021年4月4日|0| 1| 0| 1|
我已经尝试使用下面的代码,但还没有得到预期的结果

df = df.resample('M')['category'].value_counts().to_frame().rename({'category':'count'},axis=1)
df = df.pivot_table(index='date', columns='category')
brccelvz

brccelvz1#

loc_mnth_yr列使用DataFrame.assign,然后按DataFrame.meltcrosstab的计数值反透视:

df['date'] = pd.to_datetime(df['date'], format='%Y-%d-%m')

df = (df.assign(loc_mnth_yr = df['loc']+ '_' + df['date'].dt.strftime('%m_%Y'))
        .melt(id_vars='loc_mnth_yr', value_vars=['category','status']))

df = pd.crosstab(df['loc_mnth_yr'], df['value']).add_prefix('n_')
print (df)
value        n_domestic  n_found  n_not found  n_wild
loc_mnth_yr                                          
axe_02_2020           0        1            0       1
axe_04_2021           0        0            1       1
axp_01_2019           4        3            1       0
axp_10_2020           2        2            0       0

如果顺序很重要,请用途:

df['date'] = pd.to_datetime(df['date'], format='%Y-%d-%m')

df = (df.assign(mnth_yr = df['date'].dt.strftime('%m_%Y'))
        .melt(id_vars=['loc', 'mnth_yr'], value_vars=['category','status']))

df = (pd.crosstab([df['mnth_yr'], df['loc']], df['value'])
        .reindex(columns=df['value'].unique())
        .add_prefix('n_'))
df.index = [f'{b}_{a}' for a, b in df.index]

df = df.rename_axis(index='loc_mnth_yr', columns=None).reset_index()
print (df)
   loc_mnth_yr  n_domestic  n_wild  n_found  n_not found
0  axp_01_2019           4       0        3            1
1  axe_02_2020           0       1        1            0
2  axe_04_2021           0       1        0            1
3  axp_10_2020           2       0        2            0

相关问题