在Pandas Dataframe中聚合,转置和引入值

时间:2016-12-05 19:34:03

标签: python pandas

Input DF:

ID Time Value 
0   1    5
0   2    7
0   3    8
1   1    1
1   2    4
1   3    6

Output DF:
   1  2  3
0  5  7  8
1  1  4  6 

目标:我目前有类似于输入DF的东西,我希望将其转换为输出DF。

  • 输出DF的第1行等于唯一的时间数据点。
  • 输出DF的第1列等于唯一ID。
  • 中心点等于给定id / time
  • 的Value元素

我最接近的是做这样的事情:

group_by = input_df.groupby('ID').agg({'Value':np.mean})

或者:

group_by = input_df.groupby('time').agg({'Value':np.mean})

这会让我得到按ID或时间累计的汇总方式,但我无法弄清楚如何做到这两个并只是拉入值。

2 个答案:

答案 0 :(得分:4)

您可以使用pivot:

df.pivot(index='ID', columns='Time', values='Value')
Out: 
Time  1  2  3
ID           
0     5  7  8
1     1  4  6

这假设时间/ ID对是唯一的。如果没有,您可以用pivot_table替换它并添加合适的聚合函数:

df.pivot_table(index='ID', columns='Time', values='Value', aggfunc='first')
Out: 
Time  1  2  3
ID           
0     5  7  8
1     1  4  6

您的方法也适用于拆散:

df.groupby(['ID', 'Time'])['Value'].agg('mean').unstack()
Out: 
Time  1  2  3
ID           
0     5  7  8
1     1  4  6

答案 1 :(得分:1)

import pandas as pd

df = pd.DataFrame([(0, 1, 5), (0, 2, 7), (0, 3, 8), (1, 1, 1), (1, 2, 4), (1, 3, 6)], columns=['ID', 'Time', 'Value'])
df

Out[5]: 
   ID  Time  Value
0   0     1      5
1   0     2      7
2   0     3      8
3   1     1      1
4   1     2      4
5   1     3      6

df.pivot(index='ID', columns='Time', values='Value')

Out[7]: 
Time  1  2  3
ID           
0     5  7  8
1     1  4  6