python-3.x Dataframe 中值的groupby和计数

bfrts1fy  于 2023-03-24  发布在  Python
关注(0)|答案(4)|浏览(139)

我在excel/dataframe中有以下值。

在这里我需要通过'日期'列的值分组,并分别需要把其他2字段的值计数.像下面,

我试着遵循代码,但它只给出了日期。

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

df1 = df['Date'].dt.date.value_counts().sort_index().reset_index()
df1.columns = ['DATE','Count']

注意:有百万

oyt4ldly

oyt4ldly1#

您可以将value_countsjoinmelt + groupby.value_counts一起使用:

g = df.melt(['ID', 'date']).groupby('date')

(df['date'].value_counts().to_frame(name='count')
 .join(g['value'].value_counts().unstack('value', fill_value=0))
 .rename_axis('date').reset_index()
)

或者concatgroupby.value_counts

g = df.groupby('date')

pd.concat([g['date'].count().to_frame(name='count'),
           g['status'].value_counts().unstack(fill_value=0),
           g['from'].value_counts().unstack(fill_value=0)],
         axis=1).reset_index()

输出:

date  count  False  True  road  water
0  01/02/23      4      2     2     3      1
1  01/04/23      2      1     1     2      0
2  01/22/23      1      1     0     1      0
3  01/03/23      1      0     1     0      1
lvmkulzt

lvmkulzt2#

一种方法是使用pd.get_dummies:

pd.concat(
    [
        pd.get_dummies(
            df.set_index("date").drop("ID", axis=1), columns=["status", "from"]
        )
        .groupby(level=0)
        .sum(),
        df["date"].value_counts(),
    ],
    axis=1,
)

输出:

status_FALSE  status_TRUE  from_road  from_water  date
2023-01-02             2            2          3           1     4
2023-01-03             0            1          0           1     1
2023-01-04             1            1          2           0     2
2023-01-22             1            0          1           0     1
xfb7svmp

xfb7svmp3#

以下是使用pd.get_dummies()的方法:

(pd.get_dummies(df.iloc[:,1:],columns = ['status','from'],prefix = '',prefix_sep='')
.groupby('date').sum()
.join(df['date'].value_counts().rename('date_counts')))
fhity93d

fhity93d4#

另一种可能的解决方案,基于创建两个数据透视表(一个用于status,另一个用于from)并连接两个数据透视表的想法:

out = df.drop('ID', axis=1)

aux = out.pivot_table(
    index='date', columns='status', values='status', aggfunc='count', fill_value=0)

(pd.concat([
    aux.sum(axis=1).rename('count'),
    aux,
    out.pivot_table(
        index='date', columns='from', values='from', aggfunc='count', fill_value=0)],
           axis=1)
 .reset_index())

输出:

date  count  False  True  road  water
0   1/2/2023      4      2     2     3      1
1  1/22/2023      1      1     0     1      0
2   1/3/2023      1      0     1     0      1
3   1/4/2023      2      1     1     2      0

相关问题