我之前已经搜索过这个问题,但是也许我的英语不够好,无法找到解决方案。我搜索一种简单的方法将图1中的pandas数据框转换为图2。为每个NB创建尽可能多的行,但是我必须保持所有其他数据(60列^^“)的位置保持不变。
预先感谢您的支持!
Figure 1
+------+-----+-----+-----+-----+------+-----+
| name | NB1 | NB2 | NB3 | NB4 | Date | ... |
+------+-----+-----+-----+-----+------+-----+
| John | 113 | 115 | 120 | 200 | X1 | |
| Alex | 200 | 115 | | | X2 | |
| Bob | 113 | 115 | 200 | | X3 | |
+------+-----+-----+-----+-----+------+-----+
Figure 2
+------+-----+------+-----+
| name | NB | Date | ... |
+------+-----+------+-----+
| John | 113 | X1 | |
| John | 115 | X1 | |
| John | 120 | X1 | |
| John | 200 | X1 | |
| Alex | 113 | X2 | |
| Alex | 115 | X2 | |
| Bob | 113 | X3 | |
| Bob | 115 | X3 | |
| Bob | 200 | X3 | |
+------+-----+------+-----+
data = """
name NB1 NB2 NB3 NB4 Date ...
John 113 115 120 200 X1
Alex 200 115 None None X2
Bob 113 115 200 None X3
"""
res = pd.read_csv(StringIO(data),sep="\s{2,}", engine='python',na_values=["None"]).dropna(how="all",axis=1)
res.set_index(['name','Date']).stack().droplevel(-1).reset_index(name="NB")
name Date NB
0 John X1 113.0
1 John X1 115.0
2 John X1 120.0
3 John X1 200.0
4 Alex X2 200.0
5 Alex X2 115.0
6 Bob X3 113.0
7 Bob X3 115.0
8 Bob X3 200.0