如何为数据框中的每个唯一 ID 创建特定的 date_range?

富有的

我想为数据集中的每个客户创建一个日期范围。每个客户都有自己的范围。如果没有 for 循环,如何做到这一点?

样本数据:

import pandas as pd
dates = ['2018-01', '2018-04', '2018-10', '2018-11', '2018-12', '2018-01', '2018-04']
customers = ['A', 'A', 'A', 'A', 'A', 'B', 'B']
df = pd.DataFrame({'customers':customers, 'date':dates})
df.head(10)

现在我希望每个客户的每一行都有一个月的时间,分别是他们的最短最长日期,以获得:

预期输出:

import pandas as pd
dates = ['2018-01', '2018-02', '2018-03', '2018-04', '2018-05', '2018-06', '2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2018-01', '2018-02', '2018-03', '2018-04']
customers = ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B','B']
df1 = pd.DataFrame({'customers':customers, 'date':dates})
df1.head(16)

我的尝试是使用 for 循环,遍历每个客户,但速度太慢。如何让它更快?

def get_date_frame(start_date, end_date):
    date_frame = pd.date_range(start=start_date, end=end_date, freq='MS')
    date_frame = pd.DataFrame(pd.DataFrame(date_frame.astype(str))[0].str[:7])
    date_frame.columns = ['date']
    return date_frame

for idx, jk in (enumerate(['A', 'B'])):
    guy = df[df['customers']==jk]['date'] #get the data for that customer
    guy.reset_index(drop=True, inplace=True) #reset
    
    start = guy[0] #first date
    end = guy[len(guy)-1]  #last date
    
    dframe = get_date_frame(start, end) #get range of dates
    dframe['customer'] = jk #add customer id

    if idx == 0:
        out = dframe.copy()
    else:
        out = pd.concat((out, dframe.copy()), axis = 0) #concat outputs
Epsi95
df['date'] = pd.to_datetime(df['date'], format='%Y-%d')

df2 = df.groupby(['customers']).apply(
    lambda x: x.set_index('date')
    .reindex(pd.date_range(start = x['date'].min(), end = x['date'].max()))
    .ffill()
    .rename_axis('date')
    .reset_index())

print(df2)
                   date customers
customers                        
A         0  2018-01-01         A
          1  2018-01-02         A
          2  2018-01-03         A
          3  2018-01-04         A
          4  2018-01-05         A
          5  2018-01-06         A
          6  2018-01-07         A
          7  2018-01-08         A
          8  2018-01-09         A
          9  2018-01-10         A
          10 2018-01-11         A
          11 2018-01-12         A
B         0  2018-01-01         B
          1  2018-01-02         B
          2  2018-01-03         B
          3  2018-01-04         B

此外,如果您想转换日期列,则

df2 = df2.droplevel('customers') #drop the index customer

df2['date'] = df2['date'].dt.year.astype(str) +'-'+ df2['date'].dt.day.astype(str) 
       date customers
0    2018-1         A
1    2018-2         A
2    2018-3         A
3    2018-4         A
4    2018-5         A
5    2018-6         A
6    2018-7         A
7    2018-8         A
8    2018-9         A
9   2018-10         A
10  2018-11         A
11  2018-12         A
0    2018-1         B
1    2018-2         B
2    2018-3         B
3    2018-4         B

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

特定日期的熊猫date_range

如何为wordpress中的每个附件图片创建一个唯一的ID?

如何为Oracle中的每个插入创建一个唯一的id

Pandas `date_range` 中的动态级别

如何为熊猫数据框中按ID分组的每个列的每个唯一值查找最小值

熊猫date_range与特定时间范围

Python从特定时间开始date_range

如何使用日期时间和数字输入在此熊猫数据框中创建唯一的ID?

如何在Spark数据框中创建唯一的自动生成的ID列

如何在Pandas Dataframe中扩展date_range?

如何从熊猫date_range中删除日期

熊猫date_range在月初生成月度数据

如何为每个ID的特定变量创建滞后变量

如何将熊猫 date_range 移动 n 年

使用date_range时如何使X轴更详细

如何使用熊猫从某个时间戳获取date_range?

如何合并dataframe和date_range系列?

从熊猫date_range中随机选择n个日期

如何为连续日期的每个夜间时段创建唯一的ID?

如何为每个唯一ID获取一行,每个特定列的值包含多个列

Python Pandas:在date_range操作中尝试加速每个日期的每一行

如何为数据库字段创建顺序唯一ID

如何在 Pandas 数据框中通过具有日期时间索引的唯一 ID 创建列

如何为Pandas数据框的给定列中的每个唯一组件创建一个新列?

如何为 R 中的数据框每 14 天创建一个唯一值

如何为指纹模板创建唯一的ID

如何为动态创建的视图分配唯一的ID?

我们如何找到数据框中每个唯一 ID 的变异系数?

如何在数据框中为每个唯一ID执行操作?