如何从由两个字段'timestamps'和"user_id"索引的数据框中获取仅特定user_id的所有字段?



>我在下面透视的数据帧中包含下表:

        cost        cost        cost        val1        val1        val1    
user_id     1       2       3       1       2       3   
timestamp
01/01/2011      1               100     3               5   
01/02/2011              20  8           
01/07/2012      19  57                  
01/11/2012  3100    49  
21/12/2012              240 30          
14/09/2013      21  63                  
01/12/2013  3200    51  

想知道我如何获得另一个仅包含与特定用户 ID 关联的字段的数据帧,即(基于我的示例)能够获得类似 df_by_user_id = 透视 ['user_id'=1] 或 df_by_user_id = 透视 ['user_id'=2] 或 df_by_user_id = 透视 ['user_id'=3](知道上表按"时间戳"和"user_id"分组)。(我的最终目的是能够为每个user_id制作一个情节)。

为了获得上表,代码使用是:

import pandas as pd
newnames = ['timestamp','user_id', 'cost', 'val1','val2', 'val3','code']
df = pd.read_csv('mytest.csv', names = newnames, header = False, parse_dates=True, dayfirst=True)
df['timestamp'] = pd.to_datetime(df['timestamp'], dayfirst=True) 
pivoted = df.pivot('timestamp', 'user_id')

提前感谢您的帮助。

因此,让我们从这个可重现的数据帧开始:

import numpy as np
import pandas
np.random.seed(0)
N = 6
data = np.random.random_integers(low=0, high=200, size=(N, N))
cols = pandas.MultiIndex.from_product([('cost', 'value'), (1, 2, 3)], names=['quantity', 'user_id'])
dates = pandas.DatetimeIndex(freq='1M', start='2010-01-01', periods=N, name='date')
df = pandas.DataFrame(data, columns=cols, index=dates)

即:

quantity    cost            value          
user_id        1    2    3      1    2    3
date                                       
2010-01-31   172   47  117    192   67  195
2010-02-28   103    9   21     36   87   70
2010-03-31    88  140   58    193   39   87
2010-04-30   174   88   81    165   25   77
2010-05-31    72    9  148    115  197   79
2010-06-30   175  192   82     99  177   29

沿数据帧的轴 1 取横截面 (xs

df.xs(1, level='user_id', axis=1)

这给了:

quantity    cost  value
date                   
2010-01-31   172    192
2010-02-28   103     36
2010-03-31    88    193
2010-04-30   174    165
2010-05-31    72    115
2010-06-30   175     99

或者,您可以通过以下方式挑选所有费用:

df.xs('cost', level='quantity', axis=1)
user_id       1    2    3
date                     
2010-01-31  172   47  117
2010-02-28  103    9   21
2010-03-31   88  140   58
2010-04-30  174   88   81
2010-05-31   72    9  148
2010-06-30  175  192   82

由于该级别的列未在数据帧中命名,因此可以使用其索引访问它:

df.xs('cost', level=0, axis=1)
user_id       1    2    3
date                     
2010-01-31  172   47  117
2010-02-28  103    9   21
2010-03-31   88  140   58
2010-04-30  174   88   81
2010-05-31   72    9  148
2010-06-30  175  192   82

如果对行具有多级索引,则可以使用 axis=0 根据行标签选择项目。但是,由于您现在关心的是列,请使用axis=1