通过将分组类别转换为字段来转换分组数据(使用GraphLab或Panda的DataFrame)

时间:2017-01-08 15:22:21

标签: python pandas dataframe graphlab sframe

我有以下记录按user_id和action列分组。

user_id | action | count
1       | read   | 15
1       | write  | 5
1       | delete | 7
2       | write  | 2
3       | read   | 9
3       | write  | 1
3       | delete | 2

我想将此表转换为以下格式,其中每个操作现在都是一列,行是计数值。

user_id | read | write | delete
1       | 15   | 5     | 7
2       | 0    | 2     | 0
3       | 9    | 1     | 2

我知道如何使用循环执行此操作,但我很好奇是否有更有效的方法在GraphLab中创建SFrame或Panda的DataFrame。

我感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

你可以pivot

df.pivot_table('count', 'user_id', 'action', fill_value=0)

enter image description here

答案 1 :(得分:1)

您可以pivot使用fillnaastype使用float int df = df.pivot(index='ser_id', columns='action', values='count').fillna(0).astype(int) print (df) action delete read write ser_id 1 7 15 5 2 0 0 2 3 2 9 1

df = df.set_index(['ser_id','action'])['count'].unstack(fill_value=0)
print (df)
action  delete  read  write
ser_id                     
1            7    15      5
2            0     0      2
3            2     9      1

set_indexunstack的另一种解决方案:

ser_id

解决方案,如果actionpivot以及unstackdf = df.groupby(['ser_id','action'])['count'].mean().unstack(fill_value=0) print (df) action delete read write ser_id 1 7 15 5 2 0 0 2 3 2 9 1 列中的重复项无法使用groupby,则会聚合mean或{{ 3}}并按sum重塑:

#random dataframe
np.random.seed(100)
N = 10000
df = pd.DataFrame(np.random.randint(100, size=(N,3)), columns=['user_id','action', 'count'])
#[10000000 rows x 2 columns]
print (df)

In [124]: %timeit (df.groupby(['user_id','action'])['count'].mean().unstack(fill_value=0))
100 loops, best of 3: 5.5 ms per loop

In [125]: %timeit (df.pivot_table('count', 'user_id', 'action', fill_value=0))
10 loops, best of 3: 35.9 ms per loop

时序:

{{1}}