Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas.Series.unstack()是否影响数据类型?_Python_Pandas - Fatal编程技术网

Python Pandas.Series.unstack()是否影响数据类型?

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()取消堆栈时,它会将所有值转换为时间增量(精度不同): 有人知道这是从哪里来的吗 编辑

我正在研究一个包含混合类型值(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()
取消堆栈时,它会将所有值转换为时间增量(精度不同):

有人知道这是从哪里来的吗

编辑

这里还有一些信息。原始数据样本:

    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