Pandas 使用groupby添加列顶部/底部N值的标志

Pandas 使用groupby添加列顶部/底部N值的标志,pandas,csv,group-by,pandas-groupby,top-n,Pandas,Csv,Group By,Pandas Groupby,Top N,我有一个CSV文件中的数据,从2015年1月1日00:00到2021年1月1日00:00,一小时一小时,ID为ID15000 我的目标是在所有时间内,每天为每个ID标记最好(标记1)和最差(标记2)4个价格。因此,每天将有4个标志1和4个标志2,其余的(16个标志0) 我想我应该首先将这个表融化为数据库格式,并应用一些脚本,如下所示。这是我的小CSV文件也 输出 如图所示,未正确分配标志 一些思考和问题 我不知道如何将Date列设置为“Date”,因为它是timeseries格式,我甚至不

我有一个CSV文件中的数据,从2015年1月1日00:00到2021年1月1日00:00,一小时一小时,ID为ID15000

我的目标是在所有时间内,每天为每个ID标记最好(标记1)和最差(标记2)4个价格。因此,每天将有4个标志1和4个标志2,其余的(16个标志0)

我想我应该首先将这个表融化为数据库格式,并应用一些脚本,如下所示。这是我的小CSV文件也

输出

如图所示,未正确分配标志

一些思考和问题

  • 我不知道如何将Date列设置为“Date”,因为它是timeseries格式,我甚至不确定python是否从CSV文件中读取该格式,因此可能会因此产生一个问题
  • 我通过从1开始到2190(考虑到从2015年到2020年有2190天)手动将该日期列转换为天,但是,NLAGEST没有很好地工作,可能是因为索引问题
  • 当我进行分组时,我是否也应该对大小脚本实现ID
  • 我的电脑有很好的马力,我必须自己做这件事。我是否应该将熔化部分和标记部分一分为二
  • 我应该为PyCharm做任何性能设置吗?i、 例如,使用100%的CPU

谢谢大家。

熊猫可以在加载csv文件时将字符串转换为日期,也可以在加载后进行转换

df = pd.read_csv("file.csv", header=0, delimiter=",", parse_dates=['Date'], infer_datetime_format=True)

然后,您可以使用
重采样
方法,该方法作为
datetime64ns
列或索引的专用
groupby

 import pandas as pd
 import datetime

    def date_parser(d):
        d = datetime.datetime.strptime(str(d),"%d.%m.%Y %H:%M")
        return d
    
    df = pd.read_csv("file.csv",header=0,delimiter=",",parse_dates=['Date'],date_parser=date_parser)
    
    #Splitting Date column to date and time
    df["time"] = df["Date"].dt.time
    df["Date"] = df["Date"].dt.date
    
    df=df.melt(
        id_vars=['Date','time'],
       var_name='ids',
      value_name='price')
    
    df['large']=df.index.isin(df.groupby(['Date','ids']).price.nlargest(4).index.get_level_values(2)).astype(int)
    df['small']=df.index.isin(df.groupby(['Date','ids']).price.nsmallest(4).index.get_level_values(2)).astype(int)
    df['flag']=df.small*2+df.large
    
    #Joining date and time column back to one Date column
    df['Date']=df['Date'].astype('str') +' '+ df['time'].astype('str')

打印(df)

请将数据以文本而不是图像的形式发布,以便我们可以复制您的数据框架添加了我的csv文件作为github链接以及更多说明。你好,Anky,是的。我需要为每天的最高和最低4个价格分配标志,因此,我需要按日期进行组合。嗨,天哪,我已经解决了这项任务,请先与我联系,以检查解决方案是否合适。然后,我将把它作为一个答案添加到这里。你们能分享一下预期的产出吗?这将清楚地确定你想要实现的目标?什么是大的,小的还是旗帜栏?嗨,埃里克,谢谢你的回复。我测试了你的parse_dates建议,但结果没有改变。看来问题出在剧本的其他部分。
df = pd.read_csv("file.csv", header=0, delimiter=",", parse_dates=['Date'], infer_datetime_format=True)
 import pandas as pd
 import datetime

    def date_parser(d):
        d = datetime.datetime.strptime(str(d),"%d.%m.%Y %H:%M")
        return d
    
    df = pd.read_csv("file.csv",header=0,delimiter=",",parse_dates=['Date'],date_parser=date_parser)
    
    #Splitting Date column to date and time
    df["time"] = df["Date"].dt.time
    df["Date"] = df["Date"].dt.date
    
    df=df.melt(
        id_vars=['Date','time'],
       var_name='ids',
      value_name='price')
    
    df['large']=df.index.isin(df.groupby(['Date','ids']).price.nlargest(4).index.get_level_values(2)).astype(int)
    df['small']=df.index.isin(df.groupby(['Date','ids']).price.nsmallest(4).index.get_level_values(2)).astype(int)
    df['flag']=df.small*2+df.large
    
    #Joining date and time column back to one Date column
    df['Date']=df['Date'].astype('str') +' '+ df['time'].astype('str')