在 pandas 中拆分和取消旋转列

Splitting and unpivoting a column in pandas

我从 .csv 文件中读取 pandas 中的以下数据框。

    Month  Date       Year   Obs_score   
0   Jan    24,25,26   2015   -1.75   
1   Mar    2          2015   -2.0  
2   Apr    3          2015   -0.5  

我需要对日期列进行逆透视,以便获得以下内容。

    Month  Date       Year   Obs_score   
0   Jan    24         2015   -1.75
1   Jan    25         2015   -1.75
2   Jan    26         2015   -1.75
3   Mar    2          2015   -2.0  
4   Apr    3          2015   -0.5

基本上使日期字段统一,每行有一个值,并为逗号分隔的日期复制 Obs_scores。有没有简单的方法可以做到这一点?索引的顺序无关紧要。

一种可能的解决方案是基于pandas merge 方法在关系的基础上创建数据库。

案例测试:

 # (just two columns for ease)
 df = pd.DataFrame({'Date' : ['24,25,26','2','3']
         , 'score' : [-1.75,-2.0,-0.5] })  

       Date  score
0  24,25,26  -1.75
1         2  -2.00
2         3  -0.50

1:生成 "split" 列(假设条目是字符串中的逗号分隔值)

  b = df['Date'].apply(lambda x : pd.Series(x.split(","))).stack()

 0  0    24
    1    25
    2    26
 1  0     2
 2  0     3

2: 重置索引并在正确标签的基础上合并

 b_reset = b.reset_index()

     level_0  level_1   0
  0        0        0  24
  1        0        1  25
  2        0        2  26
  3        1        0   2
  4        2        0   3

 df_reset = df.reset_index()

    index      Date  score
  0      0  24,25,26  -1.75
  1      1         2  -2.00
  2      2         3  -0.50

很明显,必须在一对多关系中合并 b_resetdf_reset,链接 b_resetindexlevel_0df_reset 个:

df_temp = pd.merge(b_reset 
           , df_reset
           , left_on = 'level_0'
           , right_on = 'index' )

3:我们最终只保留了有用的列

df_t[['score',0]]


   score   0
0  -1.75  24
1  -1.75  25
2  -1.75  26
3  -2.00   2
4  -0.50   3