python - 熊猫融化2组柱子
问题描述
我有一张桌子
id name sec1 sec2 sec3 sec4 sec5 sec6
1 abc mp(6) up(7) sp(8) cp(7) 2 4
我想输出为
id name tests values slots
1 abc mp 6 2
1 abc up 7 2
1 abc sp 8 2
1 abc cp 7 2
1 abc mp 6 4
1 abc up 7 4
1 abc sp 8 4
1 abc cp 7 4
有人可以帮我用融化来规范这个吗?提前致谢
解决方案
首先我们从set_index
and开始stack()
。
然后我们提取测试值并将其放在自己的列中并重置索引:
s = df.set_index(['id','name'],append=True).stack().to_frame('tests')
s['values'] = s['tests'].str.extract('(\d+)')[0]
df1 = s.dropna(subset=['values']).reset_index([1,2,3])
df1['tests'] = df1['tests'].str.replace('\(.*\)','')
print(df1)
id name level_3 tests values
0 1 abc sec1 mp 6
0 1 abc sec2 up 7
0 1 abc sec3 sp 8
0 1 abc sec4 cp 7
好的,现在我们需要一些与 SQL 中的交叉连接非常相似的东西,即根据len
插槽的重复数据帧并相应地添加每个值。
请注意,这是您的数据框的产品,更好的方法是使用合并,但您没有明确输入,例如多行的显示方式。
pd.concat
让我们使用参数来试试这个keys
:
vals = s.loc[s['values'].isna(),'tests'].values
final = pd.concat([df1 ]* len(vals),0,keys=vals)\
.reset_index(0).rename(columns={'level_0' : 'slots'})
print(final[['id','name','tests','values','slots']])
id name tests values slots
0 1 abc mp 6 2
0 1 abc up 7 2
0 1 abc sp 8 2
0 1 abc cp 7 2
0 1 abc mp 6 4
0 1 abc up 7 4
0 1 abc sp 8 4
0 1 abc cp 7 4
避免使用以下产品merge
:
vals = s.loc[s['values'].isna(), 'tests'].reset_index([2,3],drop=True)\
.to_frame('slots').reset_index(1)
print(pd.merge(df1,vals,on=['id']))
id name level_3 tests values slots
0 1 abc sec1 mp 6 2
1 1 abc sec1 mp 6 4
2 1 abc sec2 up 7 2
3 1 abc sec2 up 7 4
4 1 abc sec3 sp 8 2
5 1 abc sec3 sp 8 4
6 1 abc sec4 cp 7 2
7 1 abc sec4 cp 7 4
推荐阅读
- wordpress - 如何在wordpress中使用rest api生成多个不同大小的图像
- php - Selenium PHP Web 驱动程序(Facebook)问题
- java - Spring Boot JPA(Hibernate) 如何保存图像
- selenium - 使用 Selenium Webdriver 提供登录详细信息不正确,即使其正确
- .net - 使用 .net 4.5.2 和 angularjs 在后台下载文件
- c# - 在无排序的未排序双(小数)数组中查找 n 个最大值
- javascript - 根据 jquery handlebar.js 的值禁用复选框
- javascript - 如何从 chrome 控制台单击网页中的按钮?
- java - YAJSW 远程调试应用
- google-bigquery - Big Query SQL UDF 结构是否允许像 java 脚本 UDF 中的复杂逻辑?