在几列中为每次出现创建尽可能多的记录

问题描述 投票:0回答:1

我之前已经搜索过这个问题,但是也许我的英语不够好,无法找到解决方案。我搜索一种简单的方法将图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   |     |
+------+-----+------+-----+


python pandas
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.