我有一张这样的桌子。
user 01/12/15 02/12/15 someBool
u1 100 300 true
u2 200 -100 false
u3 -50 200 true
我想将日期列重新分区为两列date
和value
。
user date value someBool
u1 01/12/15 100 true
u1 02/12/15 300 true
u2 01/12/15 200 false
u2 02/12/15 -100 false
u3 01/12/15 50 true
u3 02/12/15 200 true
如何在python中执行此操作?
pivot_table
中的pandas
是否有帮助?
如果可能,提供代码/伪代码&提供有关python版本的详细信息。
答案 0 :(得分:6)
您需要melt
:
df = pd.melt(df, id_vars=['user','someBool'], var_name='date')
print (df)
user someBool date value
0 u1 True 01/12/15 100
1 u2 False 01/12/15 200
2 u3 True 01/12/15 -50
3 u1 True 02/12/15 300
4 u2 False 02/12/15 -100
5 u3 True 02/12/15 200
stack
的另一个解决方案:
df = df.set_index(['user','someBool'])
.stack()
.reset_index(name='value')
.rename(columns={'level_2':'date'})
print (df)
user someBool date value
0 u1 True 01/12/15 100
1 u1 True 02/12/15 300
2 u2 False 01/12/15 200
3 u2 False 02/12/15 -100
4 u3 True 01/12/15 -50
5 u3 True 02/12/15 200
答案 1 :(得分:3)
numpy
重建整个事物id_vars = ['user', 'someBool']
the_rest = df.columns.difference(id_vars).tolist()
m, n = len(df), len(the_rest)
var_slc = np.arange(m).repeat(n)
pd.DataFrame(
np.hstack([
df[id_vars].values[var_slc],
np.tile(the_rest, m)[:, None],
df[the_rest].values.reshape(-1, 1)
]), columns=id_vars + ['date', 'value']
)
user someBool date value
0 u1 True 01/12/15 100
1 u1 True 02/12/15 300
2 u2 False 01/12/15 200
3 u2 False 02/12/15 -100
4 u3 True 01/12/15 -50
5 u3 True 02/12/15 200