Pandas 按日期值旋转 table 列
Pandas Pivot table column columns by date value
我有一个数据透视表 table,其中行按日期排序,然后列按字母顺序排列。
我希望看到不同的列顺序。例如,如果位置在第一行显示一个值,那么我希望它是第一列。
我基本上使用 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
我有一个数据透视表 table,其中行按日期排序,然后列按字母顺序排列。
我希望看到不同的列顺序。例如,如果位置在第一行显示一个值,那么我希望它是第一列。
我基本上使用 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