Pandas 数据透视表列按日期值

问题描述

我有一个数据透视表,其中行按日期排序,然后列按字母顺序排列。

我希望以不同的方式查看列顺序。例如,如果 location 在第一行显示一个值,那么我希望它是第一列。

我基本上使用 sort_values 尝试了以下代码的每个版本:

df1 = pd.pivot_table(df1,values = 'num',index='date',columns = 'location_name',aggfunc = "sum")
result = df1.sort_values(('date'),ascending=False)

// +-----------+---+---+---+---+
// |   date    | a | b | c | d |
// +-----------+---+---+---+---+
// | 7/31/2021 |   |   | 1 |   |
// | 8/1/2021  |   |   | 1 |   |
// | 8/2/2021  |   |   | 1 |   |
// | 8/3/2021  |   |   |   | 2 |
// | 8/4/2021  |   |   |   | 2 |
// | 8/5/2021  |   |   |   | 2 |
// | 8/6/2021  |   |   |   | 2 |
// | 8/7/2021  |   |   |   | 2 |
// | 8/8/2021  | 3 |   |   |   |
// | 8/9/2021  | 3 |   |   |   |
// | 8/10/2021 | 3 |   |   |   |
// +-----------+---+---+---+---+

所以上面列的顺序应该是 c,d,a,b,日期顺序保持不变。

有什么关于最好的方法的想法吗?

解决方法

试试:

cols = df.iloc[:,1:].apply(pd.Series.first_valid_index).sort_values().index
df = df[['date',*cols.tolist()]]
>>> df
         date    c    d    a   b
0   7/31/2021  1.0  NaN  NaN NaN
1    8/1/2021  1.0  NaN  NaN NaN
2    8/2/2021  1.0  NaN  NaN NaN
3    8/3/2021  NaN  2.0  NaN NaN
4    8/4/2021  NaN  2.0  NaN NaN
5    8/5/2021  NaN  2.0  NaN NaN
6    8/6/2021  NaN  2.0  NaN NaN
7    8/7/2021  NaN  2.0  NaN NaN
8    8/8/2021  NaN  NaN  3.0 NaN
9    8/9/2021  NaN  NaN  3.0 NaN
10  8/10/2021  NaN  NaN  3.0 NaN

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...