Python 如何获取项目在大熊猫中的第一次和最后一次出现

Python 如何获取项目在大熊猫中的第一次和最后一次出现,python,pandas,Python,Pandas,我在分析来自不同传感器的数据。使用时,传感器将激活(1)。但是,我只需要从第一次激活到最后一次激活的时间(和日期),而不需要中间的任何时间。找到后,我需要创建一个新的数据框,其中包含第一次和最后一次出现的时间和日期,以及“用户”和“活动” 我试图遍历每一行并构建一系列if-then语句,但没有成功。 我想知道是否有一个熊猫功能可以让我高效地完成它? 这是我的数据的一个子集 我刚刚开始了解熊猫的窍门,所以任何帮助都将不胜感激 干杯 import pandas as pd c

我在分析来自不同传感器的数据。使用时,传感器将激活(1)。但是,我只需要从第一次激活到最后一次激活的时间(和日期),而不需要中间的任何时间。找到后,我需要创建一个新的数据框,其中包含第一次和最后一次出现的时间和日期,以及“用户”和“活动”

我试图遍历每一行并构建一系列if-then语句,但没有成功。 我想知道是否有一个熊猫功能可以让我高效地完成它? 这是我的数据的一个子集

我刚刚开始了解熊猫的窍门,所以任何帮助都将不胜感激

干杯

import pandas as pd            
cols=['User', 'Activity', 'Coaster1', 'Coaster2', 'Coaster3',
           'Coaster4', 'Coaster5', 'Coffee', 'Door', 'Fridge', u'coldWater',
           'hotWater', 'SensorDate', 'SensorTime', 'RegisteredTime']

 data=[['Chris', 'coffee + hot water', 0, 0.0, 0.0, 0, 0, 0.0, 1.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:54', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 0.0, 0.0, 0, 0, 0.0, 1.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:54', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 0.0, 0.0, 0, 0, 0.0, 1.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:55', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 0.0, 0.0, 0, 0, 0.0, 1.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:55', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 0.0, 0.0, 0, 0, 0.0, 1.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:56', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 0.0, 0.0, 0, 0, 0.0, 1.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:56', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 1.0, 0.0, 0, 0, 0.0, 0.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:58', '13:09:00'],
           ['Chris', 'coffee + hot water', 0, 1.0, 0.0, 0, 0, 0.0, 0.0, 0.0,
            0.0, 0.0, '2015-09-21', '13:05:59', '13:09:00']]

  df=pd.DataFrame(data,columns=cols)
所需的输出如下所示:

data_out=[['Chris','coffee + hot water','0','0','0','0','0','0','1','0','0','0','2015-09-21','13:05:54','13:05:56','13:09:00'],['Chris','coffee + hot water','0','1','0','0','0','0','0','0','0','0','2015-09-21','13:05:58','13:05:59','13:09:00']]

cols_out=['User',
 'Activity',
 'Coaster1',
 'Coaster2',
 'Coaster3',
 'Coaster4',
 'Coaster5',
 'Coffee',
 'Door',
 'Fridge',
 u'coldWater',
 'hotWater',
 'SensorDate',
 'SensorTimeFirst',
'SensorTimeLast',
 'RegisteredTime']


df_out=pd.DataFrame(data_out, columns=cols_out)
您可以尝试使用自定义功能
f
如下:

def f(x):
    Doormin = x[x['Door'] == 1].min()
    Doormax = x[x['Door'] == 1].max()
    Coaster2min = x[x['Coaster2'] == 1].min()
    Coaster2max = x[x['Coaster2'] == 1].max()    
    Coaster1min = x[x['Coaster1'] == 1].min()
    Coaster1max = x[x['Coaster1'] == 1].max()      
    Door = pd.Series([Doormin['Door'], Doormin['SensorDate'], Doormin['SensorTime'], Doormax['SensorTime'], Doormin['RegisteredTime']], index=['Door','SensorDate','SensorTimeFirst','SensorTimeLast','RegisteredTime'])
    Coaster1 = pd.Series([Coaster1min['Coaster1'], Coaster1min['SensorDate'], Coaster1min['SensorTime'], Coaster1max['SensorTime'], Coaster1min['RegisteredTime']], index=['Coaster1','SensorDate','SensorTimeFirst','SensorTimeLast','RegisteredTime'])
    Coaster2 = pd.Series([Coaster2min['Coaster2'], Coaster2min['SensorDate'], Coaster2min['SensorTime'], Coaster2max['SensorTime'], Coaster2min['RegisteredTime']], index=['Coaster2','SensorDate','SensorTimeFirst','SensorTimeLast','RegisteredTime'])

    return pd.DataFrame([Door, Coaster2, Coaster1])

print df.groupby(['User','Activity']).apply(f)

                            Coaster1  Coaster2  Door RegisteredTime  \
User  Activity                                                        
Chris coffee + hot water 0       NaN       NaN     1       13:09:00   
                         1       NaN         1   NaN       13:09:00   
                         2       NaN       NaN   NaN            NaN   

                            SensorDate SensorTimeFirst SensorTimeLast  
User  Activity                                                         
Chris coffee + hot water 0  2015-09-21        13:05:54       13:05:56  
                         1  2015-09-21        13:05:58       13:05:59  
                         2         NaN             NaN            NaN  
您可以通过以下方式添加
0
而不是
NaN


您可以使用以下功能。您将获得所有项目的频率。
data.value\u counts()

您的示例的期望输出是什么?也许您可以尝试
print df[df['Door']=1].groupby(['User','Activity'])[['Door','SensorDate','SensorTime'].min()
print df[df['Door']=1].groupby(['User','Activity'])['Door','SensorDate','SensorTime'].max()
在OP中添加了所需的编辑输出。谢谢!谢谢这似乎是我需要的功能。将在我的完整数据集中尝试。非常感谢!非常感谢。这就像一个符咒:)我可以从这里继续下去。非常感谢!!!我非常感谢您花费的时间和精力:)两个问题:1)如何将数据框粘贴到您的答案中,使其保持格式?为了使我的问题更整洁,我找不到这样做的方法。2) 在第一个示例中,为什么第2行是空的(NaN),并且在.fillna(0)之后仍然是空的?我不完全理解这一点(尽管我知道如何处理它,只是好奇而已)。什么是保持格式化?代码的格式化?还是最终的数据帧?可能在每行前尝试4个空格。粘贴的代码似乎是“语法检查”,带有颜色和格式,以及print df语句的输出;你只是从你的python外壳复制/粘贴到这里吗?我使用
Spyder
,它包含在。然后您可以用这种方式格式化代码。答复2。它是空的,因为函数
f
不返回任何数据。
df = df.groupby(['User','Activity']).apply(f)
df[['Coaster1','Coaster2','Door']] = df[['Coaster1','Coaster2','Door']].fillna(0)
print df
                            Coaster1  Coaster2  Door RegisteredTime  \
User  Activity                                                        
Chris coffee + hot water 0         0         0     1       13:09:00   
                         1         0         1     0       13:09:00   
                         2         0         0     0            NaN   

                            SensorDate SensorTimeFirst SensorTimeLast  
User  Activity                                                         
Chris coffee + hot water 0  2015-09-21        13:05:54       13:05:56  
                         1  2015-09-21        13:05:58       13:05:59  
                         2         NaN             NaN            NaN