首页 > 解决方案 > 如何在python中使用映射值将日期从列转置到行?

问题描述

我有一个像这样的 python pandas 数据框:

id | Client | Type | V1  |  V2 |  V3 |  V4 |
---------------------------------------------
0  |  John  | Time | 20  | 24  |     |     |
0  |  John  |Score |  7  |  8  |     |     |
0  |  John  |Level |  A  |  B  |     |     |
1  |  Tim   | Time | 15  | 19  |  20 |  18 |
1  |  Tim   |Score |  9  |  8  |  6  |  9  |
1  |  Tim   |Level |  C  |  A  |  C  |  A  | 
2  | Daniel | Time | 17  |     |     |     |
2  | Daniel |Score |  7  |     |     |     |
2  | Daniel |Level |  B  |     |     |     |

我想转置到这张表中:

Client | Time |Score | Level 
--------------------------------
 John  |  20  |  7   |  A   |
 John  |  24  |  8   |  B   |
 Tim   |  15  |  9   |  C   |
 Tim   |  19  |  8   |  A   |
 Tim   |  20  |  6   |  C   |
 Tim   |  18  |  9   |  A   |
Daniel |  17  |  7   |  B   |

我使用 pd.melt 或 df.stack 阅读了一些帖子,但似乎我的情况有点不同。任何建议表示赞赏。

标签: pythonpandasdataframetranspose

解决方案


DataFrame.melt与 removeinf 缺失值一起使用DataFrame.dropna,然后使用由Series.unstack创建的助手系列重塑GroupBy.cumcount

df = df.melt(['id','Client','Type']).dropna(subset=['value'])
g = df.groupby(['Client','Type']).cumcount()
df1 = (df.set_index([g,'Client','Type'])['value'].unstack()
         .reset_index(level=0, drop=True)
         .sort_index()
         .rename_axis(None, axis=1)
         .reset_index())
print (df1)
   Client Level Score Time
0  Daniel     B     7   17
1    John     A     7   20
2    John     B     8   24
3     Tim     C     9   15
4     Tim     A     8   19
5     Tim     C     6   20
6     Tim     A     9   18

推荐阅读