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实现几乎肯定会更好