获得正确重塑该数据框的最佳方法

时间:2019-01-23 16:50:07

标签: python pandas

我有以下数据框:

df = 
    c   f   V   E
0   M   5  32  22
1   M   7  45  40
2   R   7  42  36
3   R   9  41  38
4   R   3  28  24

我想要这样的结果,其中列'f'的值是我的新列,而我的新索引是列'c'和数据帧中其余列的组合(顺序行无关紧要):

df_result = 
        3   5    7    9
 V(M) NaN  32   45  NaN
 E(M) NaN  22   40  NaN
 V(R) 28  NaN   42   41
 E(R) 24  NaN   36   38

当前,我的代码是:

df_result = pd.concat([df.pivot('c','f',col).rename(index = {e: col + '(' + e + ')' for e in df.pivot('c','f',col).index}) for col in [e for e in df.columns if e not in ['c','f']]])

有了该代码,我得到:

df_result = 
f      3   5   7   9
c
E(M)  NaN  22  40  NaN
E(R)   24 NaN  36   38
V(M)  NaN  32  45  NaN
V(R)   28 NaN  42   41

我认为这是一个有效的结果,但是,我不知道是否有一种方法可以准确地获得我的期望结果,或者至少有一种更好的方法来获得我已经得到的结果。

非常感谢您。

2 个答案:

答案 0 :(得分:3)

要获取表格,请输入.melt + .pivot_table

df_result = df.melt(['f', 'c']).pivot_table(index=['variable', 'c'], columns='f')

然后我们可以清理命名:

df_result = df_result.rename_axis([None, None], 1)
df_result.columns = [y for _,y in df_result.columns]

df_result.index = [f'{x}({y})' for x,y in df_result.index]
# Python 2.:      ['{0}({1})'.format(*x) for x in df_result.index]

输出:

         3     5     7     9
E(M)   NaN  22.0  40.0   NaN
E(R)  24.0   NaN  36.0  38.0
V(M)   NaN  32.0  45.0   NaN
V(R)  28.0   NaN  42.0  41.0

您可能会考虑保留MultiIndex而不是将其展平为新的字符串,因为对于某些聚合而言,它可能更简单。

答案 1 :(得分:2)

使用... List<OrderSpecifier<?>> orders = Collections.singletonList(((ComparableExpressionBase<?>)(QTask.task.reviewers.<SOMETHING>)).asc()); ...

进行检查
pivot_table