我有一个这样的 DataFrame:
date time value
0 2019-04-18 07:00:10 100.8
1 2019-04-18 07:00:20 95.6
2 2019-04-18 07:00:30 87.6
3 2019-04-18 07:00:40 94.2
DataFrame 包含 2019 年全年每 10 秒记录的值。我需要计算每个日期每小时 value
的标准偏差和平均值,并为它们创建两个新列。我首先尝试将每个值的小时分开,例如:
df["hour"] = df["time"].astype(str).str[:2]
然后我尝试通过以下方式计算标准偏差:
df["std"] = df.groupby("hour").median().index.get_level_values('value').stack().std()
但这行不通,我可以就这个问题提出一些建议吗?
答案 0 :(得分:4)
我们可以split
围绕分隔符time
的{{1}}列,然后使用:
对hour
组件进行切片,最后str[0]
数据框在 group
以及 date
组件和带有 hour
和 value
的聚合列 mean
上:
std
如果您想将聚合值hr = df['time'].str.split(':', n=1).str[0]
df.groupby(['date', hr])['value'].agg(['mean', 'std'])
转换为原始数据框,那么我们需要使用 broadcast
而不是 transform
:
agg
g = df.groupby(['date', df['time'].str.split(':', n=1).str[0]])['value']
df['mean'], df['std'] = g.transform('mean'), g.transform('std')
答案 1 :(得分:1)
groupby()
小时describe()
得到 mean 和 stdmerge()
返回原始数据框d = pd.date_range("1-Jan-2019", "28-Feb-2019", freq="10S")
df = pd.DataFrame({"datetime":d, "value":np.random.uniform(70,90,len(d))})
df = df.assign(date=df.datetime.dt.strftime("%Y-%m-%d"),
time=df.datetime.dt.strftime("%H:%M:%S"))
# create a datetime column - better than manipulating strings
df["datetime"] = pd.to_datetime(df.date + " " + df.time)
# calc mean & std by hour
dfh = (df.groupby(df.datetime.dt.hour, as_index=False)
.apply(lambda dfa: dfa.describe().T.loc[:,["mean","std"]].reset_index(drop=True))
.droplevel(1)
)
# merge mean & std by hour back
df.merge(dfh, left_on=df.datetime.dt.hour, right_index=True).drop(columns="key_0")
datetime value mean std
0 2019-01-01 00:00:00 86.014209 80.043364 5.777724
1 2019-01-01 00:00:10 77.241141 80.043364 5.777724
2 2019-01-01 00:00:20 71.650739 80.043364 5.777724
3 2019-01-01 00:00:30 71.066332 80.043364 5.777724
4 2019-01-01 00:00:40 77.203291 80.043364 5.777724
... ... ... ... ...
3144955 2019-12-30 23:59:10 89.577237 80.009751 5.773007
3144956 2019-12-30 23:59:20 82.154883 80.009751 5.773007
3144957 2019-12-30 23:59:30 82.131952 80.009751 5.773007
3144958 2019-12-30 23:59:40 85.346724 80.009751 5.773007
3144959 2019-12-30 23:59:50 78.122761 80.009751 5.773007