计算 timedelta 元素的标准偏差列
Calculates a standard deviation columns for timedelta elements
我在 Python 中有以下数据框:
ID
country_ID
visit_time
0
ESP
10 days 12:03:00
0
ESP
5 days 02:03:00
0
ENG
5 days 10:02:00
1
ENG
3 days 08:05:03
1
ESP
1 days 03:02:00
1
ENG
2 days 07:01:03
2
ENG
0 days 12:01:02
对于每个 ID,我想计算每个 country_ID 组的标准差。
std_visit_ESP 和 std_visit_ENG 列。
- 访问时间的标准差 country_ID = 每个 ID 的 ESP。
- 每个 ID 的访问时间标准差 country_ID = ENG。
ID
std_visit_ESP
std_visit_ENG
0
2 days 17:00:00
0 days 00:00:00
1
0 days 00:00:00
0 days 12:32:00
2
NaT
0 days 00:00:00
对于mean的groupby方法,可以指定参数numeric_only = False,但是groupby的std方法没有这个选项
我的想法是将timedelta转换为秒,计算标准差,然后将其转换回timedelta。这是一个例子:
td1 = timedelta(10,0,0,0,3,12,0).total_seconds()
td2 = timedelta(5,0,0,0,3,2,0).total_seconds()
arr = [td1,td2]
var = np.std(arr)
show_s = pd.to_timedelta(var, unit='s')
print(show_s)
我不知道如何将它与 groupby 一起使用以获得所需的结果。感谢您的帮助。
如果我理解正确,这应该对你有用:
stddevs = df['visit_time'].dt.total_seconds().groupby([df['country_ID']]).std().apply(lambda x: pd.Timedelta(seconds=x))
输出:
>>> stddevs
country_ID
ENG 2 days 01:17:43.835702
ESP 4 days 16:40:16.598773
Name: visit_time, dtype: timedelta64[ns]
格式:
stddevs = df['visit_time'].dt.total_seconds().groupby([df['country_ID']]).std().apply(lambda x: pd.Timedelta(seconds=x)).to_frame().T.add_prefix('std_visit_').reset_index(drop=True).rename_axis(None, axis=1)
输出:
>>> stddevs
std_visit_ENG std_visit_ESP
0 2 days 01:17:43.835702 4 days 16:40:16.598773
使用GroupBy.std
and pd.to_timedelta
total_seconds = \
pd.to_timedelta(
df['visit_time'].dt.total_seconds()
.groupby([df['ID'], df['country_ID']]).std(),
unit='S').unstack().fillna(pd.Timedelta(days=0))
print(total_seconds)
country_ID ENG ESP
ID
0 0 days 00:00:00 3 days 19:55:25.973595304
1 0 days 17:43:29.315934274 0 days 00:00:00
2 0 days 00:00:00 0 days 00:00:00
我在 Python 中有以下数据框:
ID | country_ID | visit_time |
---|---|---|
0 | ESP | 10 days 12:03:00 |
0 | ESP | 5 days 02:03:00 |
0 | ENG | 5 days 10:02:00 |
1 | ENG | 3 days 08:05:03 |
1 | ESP | 1 days 03:02:00 |
1 | ENG | 2 days 07:01:03 |
2 | ENG | 0 days 12:01:02 |
对于每个 ID,我想计算每个 country_ID 组的标准差。
std_visit_ESP 和 std_visit_ENG 列。
- 访问时间的标准差 country_ID = 每个 ID 的 ESP。
- 每个 ID 的访问时间标准差 country_ID = ENG。
ID | std_visit_ESP | std_visit_ENG |
---|---|---|
0 | 2 days 17:00:00 | 0 days 00:00:00 |
1 | 0 days 00:00:00 | 0 days 12:32:00 |
2 | NaT | 0 days 00:00:00 |
对于mean的groupby方法,可以指定参数numeric_only = False,但是groupby的std方法没有这个选项
我的想法是将timedelta转换为秒,计算标准差,然后将其转换回timedelta。这是一个例子:
td1 = timedelta(10,0,0,0,3,12,0).total_seconds()
td2 = timedelta(5,0,0,0,3,2,0).total_seconds()
arr = [td1,td2]
var = np.std(arr)
show_s = pd.to_timedelta(var, unit='s')
print(show_s)
我不知道如何将它与 groupby 一起使用以获得所需的结果。感谢您的帮助。
如果我理解正确,这应该对你有用:
stddevs = df['visit_time'].dt.total_seconds().groupby([df['country_ID']]).std().apply(lambda x: pd.Timedelta(seconds=x))
输出:
>>> stddevs
country_ID
ENG 2 days 01:17:43.835702
ESP 4 days 16:40:16.598773
Name: visit_time, dtype: timedelta64[ns]
格式:
stddevs = df['visit_time'].dt.total_seconds().groupby([df['country_ID']]).std().apply(lambda x: pd.Timedelta(seconds=x)).to_frame().T.add_prefix('std_visit_').reset_index(drop=True).rename_axis(None, axis=1)
输出:
>>> stddevs
std_visit_ENG std_visit_ESP
0 2 days 01:17:43.835702 4 days 16:40:16.598773
使用GroupBy.std
and pd.to_timedelta
total_seconds = \
pd.to_timedelta(
df['visit_time'].dt.total_seconds()
.groupby([df['ID'], df['country_ID']]).std(),
unit='S').unstack().fillna(pd.Timedelta(days=0))
print(total_seconds)
country_ID ENG ESP
ID
0 0 days 00:00:00 3 days 19:55:25.973595304
1 0 days 17:43:29.315934274 0 days 00:00:00
2 0 days 00:00:00 0 days 00:00:00