在 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_reset
和 df_reset
,链接 b_reset
和 index
的 level_0
共 df_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
我从 .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_reset
和 df_reset
,链接 b_reset
和 index
的 level_0
共 df_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