【问题标题】:Bin time column and group multiple columns within each binBin 时间列并在每个 bin 中对多个列进行分组
【发布时间】:2021-03-15 06:01:57
【问题描述】:

我有一个看起来像这样的 pandas 数据框,其中包含一个日期列和两个分类列:

Date                        Feature1   Feature2
2019-01-06 19:15:52+00:00   A          K
2019-01-27 23:44:11+00:00   B          H
2019-01-29 16:50:31+00:00   A          K
2019-01-29 19:49:15+00:00   C          J
...                         ...        ...

我想将数据分组到例如 1 周的时间箱中,并计算每个时间箱中有多少 Feature1 AND Feature2 出现。我尝试了以下方法,首先将 Date 列转换为 datetime 索引,然后使用 Grouper 函数对每周存储桶进行分类,然后进行聚合:

df = df.set_index(['Date'])
df.index = pd.to_datetime(df.index)
df = df.sort_values(by='Date', ascending=True)
df.reset_index(inplace=True)
df = df.groupby([pd.Grouper(freq='W', key='Date'), 'Feature1'])['Feature2'].agg(
    ['size', 'sum']).rename(columns={'size': 'Feature1', 'sum': 'Feature2'}).reset_index()

但这只给了我一个在时间箱内正确总结的特征。我不确定我在这里做错了什么,有什么帮助吗?

编辑 1

这是生成我的数据的最小示例:

import pandas as pd                                                                       
from datetime import datetime                                                             
import random                                                                             
import time                                                                               
import string                                                                             
                                                                                          
def random_date(seed):                                                                    
    random.seed(seed)                                                                     
    d = random.randint(1, int(time.time()))                                               
    return datetime.fromtimestamp(d).strftime('%Y-%m-%d %H:%M:%S')                        
                                                                                          
df = pd.DataFrame(columns=['date', 'Feature1', 'Feature2'])                               
for i in range(1000):                                                                      
    date = random_date(i)                                                                 
    f1 = random.choice(string.ascii_letters)                                              
    f2 = random.choice(string.ascii_letters)                                              
    d = {'date': date, 'Feature1': f1, 'Feature2': f2}                                    
    df = df.append(d, ignore_index=True)                                                  
                                                                                          
df = df.set_index(['date'])                                                             
                                                                                        df.index = pd.to_datetime(df.index)                                                       
df = df.sort_values(by='date',ascending=True) 

【问题讨论】:

  • 你能创建minimal, complete, and verifiable example 并添加预期的输出吗?
  • 谢谢form mcve,但不明白exected输出看起来怎么样?需要像我的答案一样的两列的总和和大小吗?还是其他的?

标签: python pandas


【解决方案1】:

我相信你需要 DataFrame.meltGroupBy.size 聚合:

np.random.seed(2020)
df = pd.DataFrame({'date': pd.date_range('2015-01-01', periods=100).tolist() * 100,
                   'Feature1': np.random.choice(list(string.ascii_letters), size=10000),
                   'Feature2': np.random.choice(list(string.ascii_letters), size=10000)}) 

df['date'] = pd.to_datetime(df['date'])

df = df.melt('date', var_name='Feature', value_name='val').sort_values(by='date')

df = (df.groupby([pd.Grouper(freq='W', key='date'), 'Feature', 'val'])
       .size()
       .reset_index(name='count'))
print (df)
           date   Feature val  count
0    2015-01-04  Feature1   A      5
1    2015-01-04  Feature1   B     11
2    2015-01-04  Feature1   C      6
3    2015-01-04  Feature1   D      6
4    2015-01-04  Feature1   E     15
        ...       ...  ..    ...
1554 2015-04-12  Feature2   v      9
1555 2015-04-12  Feature2   w     14
1556 2015-04-12  Feature2   x     12
1557 2015-04-12  Feature2   y      8
1558 2015-04-12  Feature2   z      7

[1559 rows x 4 columns]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多