在pandas中拆分和拆分列

时间:2015-02-02 20:29:39

标签: python 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  

我需要取消Date日期列,以便获得以下内容。

    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

基本上使Date字段统一并且每行有一个值,并复制逗号分隔日期的Obs_scores。有一个简单的方法吗?指数的顺序无关紧要。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是基于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合并为一对多关系,将level_0 b_resetindex联系起来df_reset {1}}:

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