Python 分组和缩减数据帧

Python 分组和缩减数据帧,python,numpy,pandas,Python,Numpy,Pandas,我对Python很陌生,对Pandas也很陌生(我学习Pandas比Python更困难) 我试图转换一个大数据集,但我被卡住了 我从具有以下结构的CSV上传数据 DATE ID CATEGORY 1 SUCCESS (0 or 1) 1/1/2015 a1 x 0 1/1/2015 a2 y 0 1/1/2015 a3 z 0 1/3/20

我对Python很陌生,对Pandas也很陌生(我学习Pandas比Python更困难)

我试图转换一个大数据集,但我被卡住了

  • 我从具有以下结构的CSV上传数据

    DATE       ID      CATEGORY 1      SUCCESS (0 or 1)
    1/1/2015   a1      x               0
    1/1/2015   a2      y               0
    1/1/2015   a3      z               0
    1/3/2015   a2      z               0
    1/5/2015   a1      x               0
    1/7/2015   a2      z               1
    1/9/2015   a3      y               0
    1/10/2015  a2      z               1
    1/11/2015  a3      y               0
    
  • 我的最终目标是找到一种方法将其分组到表单中,在该表单中,我可以获得一系列类别,这些类别将导致一个特定ID的成功标志,然后是一个从上一行到同一ID所经过的时间数组

    所以结果会是这样的:

        {a2: {'1':((y,z,z),(0,2,4)), '2':((z),(0))}
    
    我不确定熊猫或NumPy的多维数组是否更适合这项任务。我也不确定要在熊猫身上发挥什么样的作用才能实现这一点


    正确的方向上的一点会非常有帮助。

    我不是100%理解这个问题。 我不确定(0,2,4)是什么意思。 好的,让我们开始吧

    这是一种非熊猫式的方式,与所有的数据帧循环有关

    我将您的数据保存在csv中,请按如下方式加载:

    import pandas as pd
    import numpy as np
    df = pd.read_csv('data.csv')
    print df.head(len(df))
    
    看起来:

            DATE  ID CATEGORY  SUCCESS
    0   1/1/2015  a1        x        0
    1   1/1/2015  a2        y        0
    2   1/1/2015  a3        z        0
    3   1/3/2015  a2        z        0
    4   1/5/2015  a1        x        0
    5   1/7/2015  a2        z        1
    6   1/9/2015  a3        y        0
    7  1/10/2015  a2        z        1
    8  1/11/2015  a3        y        0
    
    现在是代码:

    uber_dict = {}
    grouped =  df.groupby(['ID'])
    for name, group in grouped:
        mini_dict = {}
        working_list = []
        i = 1
        for idx,row in group.iterrows():
            working_list.append((row['CATEGORY'],row['DATE']))
            if row['SUCCESS'] == 1:
                df = pd.DataFrame(working_list,columns= ['CATEGORY','DATE']) # let's use a bit more pandas.
                df.set_index('CATEGORY',inplace=True)
                df["DATE"] = pd.to_datetime(df["DATE"]) # my dates are string format so casting
                df['DATE'] = df['DATE'].diff()
                df['DATE'].fillna(0,inplace=True)
                df['DATE'] = df['DATE'].astype('timedelta64[D]').astype('int')
                mini_dict[str(i)] = tuple(zip(*df.to_records()))
                working_list=[]
                i = i +1
    
        if mini_dict.keys(): # see http://stackoverflow.com/questions/53513/best-way-to-check-if-a-list-is-empty
            uber_dict[name] = mini_dict
    
    print uber_dict
    
    产生

    {'a2': {'1': (('y', 'z', 'z'), (0, 2, 4)), '2': (('z',), (0,))}}
    

    哇,成功了。为了澄清,第二个数组是时间增量。我更新了您的代码,从唯一ID的第一个实例开始给出日增量,然后在成功后重置。谢谢真正的数据文件相当大,所以我必须找出如何将其放入内存中。但这太棒了,我现在有了一个继续学习的方向。