我的数据框具有许多天的时间序列数据。我想执行日常计算并将其存储在同一列中。
例如:
Dataframe
----------------------------
Timeseries A
2019-01-24 14:03:00 10
2019-01-24 14:04:00 20
2019-01-24 14:05:00 15
2019-01-25 14:06:00 9
2019-01-25 14:07:00 18
2019-01-25 14:08:00 12
我想创建一个称为每单位A puA
的新列,其中包含值A / Amax,其中Amax是当天A中的最大值。我的代码段如下:
dates_list = ['2019-01-24','2019-01-25'] #Extract uniques dates list
for i in dates_list:
df['puA'] = df['A'].loc[i]/df['A'].loc[i].max()
我目前的输出是:
Timeseries nA puA
2019-01-24 14:03:00 10 NaN
2019-01-24 14:04:00 20 NaN
2019-01-24 14:05:00 15 NaN
2019-01-25 14:06:00 n9 9/18 = 0.5
2019-01-25 14:07:00 18 18/18 = 1.0
2019-01-25 14:08:00 12 12/18 = 0.6
它仅存储最后日期,而不是全部保留。
我希望输出为
Timeseries A puA
2019-01-24 14:03:00 10 0.50
2019-01-24 14:04:00 20 1.00
2019-01-24 14:05:00 15 0.75
2019-01-25 14:06:00 9 0.50
2019-01-25 14:07:00 18 1.00
2019-01-25 14:08:00 12 0.60
如何实现此输出?
答案 0 :(得分:0)
经过反复试验,我找到了答案:
dates_list = ['2019-01-24','2019-01-25'] #Extract uniques dates list
for i in dates_list:
rows_of_interest = [ind for ind, a in enumerate(df.index) if a.strftime("%Y-%m-%d") in i]
df['puA'][rows_of_interest] = df['A'].loc[i]/df['A'].loc[i].max()
我的输出是:
Timeseries A puA
2019-01-24 14:03:00 10 0.50
2019-01-24 14:04:00 20 1.00
2019-01-24 14:05:00 15 0.75
2019-01-25 14:06:00 9 0.50
2019-01-25 14:07:00 18 1.00
2019-01-25 14:08:00 12 0.60
答案 1 :(得分:0)
尽管我看到您找到了答案,但是您的解决方案看起来非常难看。让我向您展示一种更清洁,更像熊猫的方法。
首先,您必须创建一个名为date的新列。
df['date'] = df['Timeseries'].dt.date ##
print(df)
Timeseries A date
0 2019-01-24 14:03:00 10 2019-01-24
1 2019-01-24 14:04:00 20 2019-01-24
2 2019-01-24 14:05:00 15 2019-01-24
3 2019-01-25 14:06:00 9 2019-01-25
4 2019-01-25 14:07:00 18 2019-01-25
5 2019-01-25 14:08:00 12 2019-01-25
现在在日期列上按功能分组,并找到每个日期的最大值
grouped_df = df.groupby(df['date']).max().reset_index()[['date', 'A']]
grouped_df.columns = ['date', 'max_A']
print(grouped_df)
date max_A
0 2019-01-24 20
1 2019-01-25 18
现在您可以使用https://gist.github.com/MaZderMind/12fe3b370e654f31ea22aaa540f5a741函数将一列中的2个数据框联接起来
merged_df = df.merge(grouped_df, on='date')
print(merged_df)
Timeseries A date max_A
0 2019-01-24 14:03:00 10 2019-01-24 20
1 2019-01-24 14:04:00 20 2019-01-24 20
2 2019-01-24 14:05:00 15 2019-01-24 20
3 2019-01-25 14:06:00 9 2019-01-25 18
4 2019-01-25 14:07:00 18 2019-01-25 18
5 2019-01-25 14:08:00 12 2019-01-25 18
现在,数据框中的每一行都有A
和max_A
。只需分隔A/max_A
merged_df['puA'] = merged_df['A']/merged_df['max_A']
print(merged_df)
Timeseries A date max_A puA
0 2019-01-24 14:03:00 10 2019-01-24 20 0.500000
1 2019-01-24 14:04:00 20 2019-01-24 20 1.000000
2 2019-01-24 14:05:00 15 2019-01-24 20 0.750000
3 2019-01-25 14:06:00 9 2019-01-25 18 0.500000
4 2019-01-25 14:07:00 18 2019-01-25 18 1.000000
5 2019-01-25 14:08:00 12 2019-01-25 18 0.666667
这是我的朋友,是熊猫。它不涉及任何难看的for循环和硬编码的字符串。