我从.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。有一个简单的方法吗?指数的顺序无关紧要。
答案 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_reset
和df_reset
合并为一对多关系,将level_0
b_reset
与index
联系起来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