Python Pandas.Series.unstack()是否影响数据类型?
我正在研究一个包含混合类型值(timedelta和int)的多索引系列: 索引:Python Pandas.Series.unstack()是否影响数据类型?,python,pandas,Python,Pandas,我正在研究一个包含混合类型值(timedelta和int)的多索引系列: 索引: MultiIndex(levels=[[7, 9, 10], ['a', 's']], labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]], names=['char', None]) 当我尝试使用pandas.Series.unstack()取消堆栈时,它会将所有值转换为时间增量(精度不同): 有人知道这是从哪里来的吗 编辑
MultiIndex(levels=[[7, 9, 10], ['a', 's']],
labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]],
names=['char', None])
当我尝试使用pandas.Series.unstack()
取消堆栈时,它会将所有值转换为时间增量(精度不同):
有人知道这是从哪里来的吗
编辑
这里还有一些信息。原始数据样本:
timestamp char
0 2008-01-15 23:56:52 7
1 2008-01-16 00:07:28 7
2 2008-01-01 16:12:32 9
3 2008-01-03 01:52:08 9
4 2008-07-06 17:23:25 10
5 2008-07-06 17:33:47 10
我提取了几个特征:
def get_session(ts):
ts = ts.sort_index()
dt = (ts - ts.shift()).fillna(0)
first_logs = dt > '30m'
sessions = first_logs.cumsum() + 1
duration = sessions.value_counts().mean() * np.timedelta64(10, 'm')
return pd.Series({'s': max(sessions), 'a': duration})
timetable = data.groupby('char')[' timestamp'].apply(get_session)
这给了我:
char
7 a 20 minutes
s 1
9 a 10 minutes
s 2
10 a 20 minutes
s 1
Name: timestamp, dtype: object
拆下支架后的外观如下所示:
timetable.unstack()
a s
char
7 00:20:00 00:00:00.000000
9 00:10:00 00:00:00.000000
10 00:20:00 00:00:00.000000
看起来像虫子
我认为您可以从函数DataFrame
返回,然后unstack
是不必要的:
def get_session(ts):
ts = ts.sort_index()
dt = (ts - ts.shift()).fillna(0)
first_logs = dt > '30m'
sessions = first_logs.cumsum() + 1
duration = sessions.value_counts().mean() * np.timedelta64(10, 'm')
return pd.DataFrame({'s': max(sessions), 'a': duration}, index=[0])
timetable = data.groupby('char')['timestamp'].apply(get_session)
print (timetable)
a s
char
7 0 00:20:00 1
9 0 00:10:00 2
10 0 00:20:00 1
但是索引存在问题(第二级都是0
),因此您可以从列s
创建索引,然后通过设置索引name
(在pandas
<0.18.0中新增):
你可以发布原始数据和代码来复制这个,再加上你的pandas和numpy版本,谢谢你的解决方案!我使用了
MultiIndex.droplevel(1)
来删除零,但是您的解决方案更短。确实有一些奇怪的事情发生了。
timetable.unstack()
a s
char
7 00:20:00 00:00:00.000000
9 00:10:00 00:00:00.000000
10 00:20:00 00:00:00.000000
def get_session(ts):
ts = ts.sort_index()
dt = (ts - ts.shift()).fillna(0)
first_logs = dt > '30m'
sessions = first_logs.cumsum() + 1
duration = sessions.value_counts().mean() * np.timedelta64(10, 'm')
return pd.DataFrame({'s': max(sessions), 'a': duration}, index=[0])
timetable = data.groupby('char')['timestamp'].apply(get_session)
print (timetable)
a s
char
7 0 00:20:00 1
9 0 00:10:00 2
10 0 00:20:00 1
def get_session(ts):
ts = ts.sort_index()
dt = (ts - ts.shift()).fillna(0)
first_logs = dt > '30m'
sessions = first_logs.cumsum() + 1
duration = sessions.value_counts().mean() * np.timedelta64(10, 'm')
return pd.DataFrame({'a': duration}, index=[max(sessions)]).rename_axis('s')
timetable = data.groupby('char')['timestamp'].apply(get_session)
print (timetable)
a
char s
7 1 00:20:00
9 2 00:10:00
10 1 00:20:00