python的范围从数据帧到生成额外的行
我有一张这样的桌子: 如何将其转换为:python的范围从数据帧到生成额外的行,python,python-3.x,list,pandas,numpy,Python,Python 3.x,List,Pandas,Numpy,我有一张这样的桌子: 如何将其转换为: ID mapping_value RANGE 10 A 001 10 A 002 10 A 003 10 A 004 10 A 212 20 C 001 20 C 002 20 C 003 20 C 004 20 C 005 20 C 006 20 C 007 这是为了使关系数据库在以后更容易加入这有点难以理解,但它将实现您所需要的 df=pd.DataFrame({
ID mapping_value RANGE
10 A 001
10 A 002
10 A 003
10 A 004
10 A 212
20 C 001
20 C 002
20 C 003
20 C 004
20 C 005
20 C 006
20 C 007
这是为了使关系数据库在以后更容易加入这有点难以理解,但它将实现您所需要的
df=pd.DataFrame({'ID':[10,20],'map':['A','C'],'Range':['001:004,212','001:007']})
df.Range=df.Range.str.split(',')
a=df.set_index(['ID','map']).Range.apply(pd.Series).stack()
yourdf=a.str.split(':').apply(pd.Series).ffill(1).\
apply(lambda x : [np.arange(int(x[0]),int(x[1])+1)],1)[0].\
apply(pd.Series).stack().\
reset_index(level=[2,3],drop=True).reset_index()
yourdf
Out[756]:
ID map 0
0 10 A 1.0
1 10 A 2.0
2 10 A 3.0
3 10 A 4.0
4 10 A 212.0
5 20 C 1.0
6 20 C 2.0
7 20 C 3.0
8 20 C 4.0
9 20 C 5.0
10 20 C 6.0
11 20 C 7.0
一些常见的python方法:
odf = pd.DataFrame([{'ID':'10', 'range':'001:004,212','mapping_value':'A'},
{'ID':'20', 'range':'001:007','mapping_value':'C'}])
df_input = []
def expand_range(i_range):
lower, upper = i_range.split(':')
return [str(e).zfill(3) for e in range(int(lower), int(upper)+1)]
for r in odf.itertuples():
for rg in [element for sublist in
[expand_range(e) if ':' in e else [e] for e in r.range.split(',')]
for element in sublist]:
df_input.append({'ID':r.ID,'mapping_value':r.mapping_value,'range':rg})
df = pd.DataFrame(df_input)
这使得:
ID mapping_value range
0 10 A 001
1 10 A 002
2 10 A 003
3 10 A 004
4 10 A 212
5 20 C 001
6 20 C 002
7 20 C 003
8 20 C 004
9 20 C 005
10 20 C 006
11 20 C 007
编辑:
从iterrows()切换到itertuples(),因为它应该更快一些,通过返回命名的整数支持漂亮的点表示法,并且显然保留了数据类型您可以添加代码而不是图片吗?图片通常不会在这里表现得很好,所以在我看来,无论这里发生了什么,用普通python实现几乎肯定会更好