我以前曾尝试问过这个问题,但是它太模棱两可了,所以再来一次。我是编程新手,所以我仍在学习如何以一种有用的方式提出问题。
总而言之,我有一个熊猫数据框,类似于“ INPUT DATA”,我想将其转换为“ DESIRED OUTPUT”,如下所示。
每行包含一个ID,一个DateTime和一个Value。对于每个唯一ID,第一行对应于时间点“零”,随后的每一行在上一行之后的5分钟内包含一个值,依此类推。
我想计算每个“经过时间”时间点所有ID的平均值。例如,在“期望的输出”中,经过的时间= 0.0将具有值128.3(100 + 105 + 180/3);经过的时间= 5.0将具有值150.0(150 + 110 + 190/3);经过时间= 10.0的值为133.3(125 + 90 + 185/3),以此类推,对于经过时间= 15、20、25等。
我不确定如何创建一个新列,该列具有每个ID所用时间的值(例如0.0、5.0、10.0等)。我认为,一旦我知道该怎么做,就可以使用groupby函数来计算每次经过的均值。
输入数据
ID DateTime Value
1 2018-01-01 15:00:00 100
1 2018-01-01 15:05:00 150
1 2018-01-01 15:10:00 125
2 2018-02-02 13:15:00 105
2 2018-02-02 13:20:00 110
2 2018-02-02 13:25:00 90
3 2019-03-03 05:05:00 180
3 2019-03-03 05:10:00 190
3 2019-03-03 05:15:00 185
期望的输出
Time Elapsed Mean Value
0.0 128.3
5.0 150.0
10.0 133.3
答案 0 :(得分:1)
这是一种方法,将transform
与groupby
一起使用可获取组密钥'Time Elapsed'
,然后仅groupby
即可获得mean
df['Time Elapsed']=df.DateTime-df.groupby('ID').DateTime.transform('first')
df.groupby('Time Elapsed').Value.mean()
Out[998]:
Time Elapsed
00:00:00 128.333333
00:05:00 150.000000
00:10:00 133.333333
Name: Value, dtype: float64
答案 1 :(得分:0)
您可以利用datetime
中DateTime
列的DataFrame
属性来明确地做到这一点
首先获取每个DateTime
的年,月和日,因为它们都在您的数据中发生变化
df['month'] = df['DateTime'].dt.month
df['day'] = df['DateTime'].dt.day
df['year'] = df['DateTime'].dt.year
print(df)
ID DateTime Value month day year
1 1 2018-01-01 15:00:00 100 1 1 2018
1 1 2018-01-01 15:05:00 150 1 1 2018
1 1 2018-01-01 15:10:00 125 1 1 2018
2 2 2018-02-02 13:15:00 105 2 2 2018
2 2 2018-02-02 13:20:00 110 2 2 2018
2 2 2018-02-02 13:25:00 90 2 2 2018
3 3 2019-03-03 05:05:00 180 3 3 2019
3 3 2019-03-03 05:10:00 190 3 3 2019
3 3 2019-03-03 05:15:00 185 3 3 2019
然后附加一个连续的DateTime
计数器列(每个this SO post)
df['Time Elapsed'] = df.groupby(['year', 'month', 'day']).cumcount() + 1
df['Time Elapsed'] *= 5
print(df)
ID DateTime Value month day year cumulative_record
1 1 2018-01-01 15:00:00 100 1 1 2018 5
1 1 2018-01-01 15:05:00 150 1 1 2018 10
1 1 2018-01-01 15:10:00 125 1 1 2018 15
2 2 2018-02-02 13:15:00 105 2 2 2018 5
2 2 2018-02-02 13:20:00 110 2 2 2018 10
2 2 2018-02-02 13:25:00 90 2 2 2018 15
3 3 2019-03-03 05:05:00 180 3 3 2019 5
3 3 2019-03-03 05:10:00 190 3 3 2019 10
3 3 2019-03-03 05:15:00 185 3 3 2019 15
在新添加的计数器列上执行groupby
dfg = df.groupby('Time Elapsed')['Value'].mean()
print(dfg)
Time Elapsed
5 128.333333
10 150.000000
15 133.333333
Name: Value, dtype: float64