Skip to main content
 首页 » 编程设计

python之如何在 Pandas 数据框中将单元格的值拆分为多行

2025年05月04日13zhwl

我有以下数据框,它是使用代码获得的:

     df1=df.groupby('id')['x,y'].apply(lambda x: rdp(x.tolist(), 5.0)).reset_index() 

引用here

得到的结果数据框:

      id          x,y 
  0   1    [(0, 0), (1, 2)] 
  1   2    [(1, 3), (1, 2)] 
  2   3    [(2, 5), (4, 6)]   

是否有可能得到这样的东西:

         id      x,y 
     0   1      (0, 0) 
     1   1      (1, 2) 
     2   2      (1, 3) 
     3   2      (1, 2) 
     4   3      (2, 5) 
     5   3      (4, 6) 

在这里,作为先前 df 的结果获得的坐标列表根据它们各自的 id 分成新行。

请您参考如下方法:

您可以将 DataFrame 构造函数与 stack 一起使用:

df2 = pd.DataFrame(df1['x,y'].values.tolist(), index=df1['id']) 
        .stack() 
        .reset_index(level=1, drop=True) 
        .reset_index(name='x,y') 
print (df2) 
 
   id     x,y 
0   1  (0, 0) 
1   1  (1, 2) 
2   2  (1, 3) 
3   2  (1, 2) 
4   3  (2, 5) 
5   3  (4, 6) 

numpy 解决方案使用 numpy.repeat按 lengths 的值按 str.len , x,y 列被 numpy.ndarray.sum 扁平化:

df2 = pd.DataFrame({'id': np.repeat(df1['id'].values, df1['x,y'].str.len()),  
                   'x,y': df1['x,y'].values.sum()}) 
 
print (df2) 
   id     x,y 
0   1  (0, 0) 
0   1  (1, 2) 
1   2  (1, 3) 
1   2  (1, 2) 
2   3  (2, 5) 
2   3  (1, 9) 
2   3  (4, 6) 

时间:

In [54]: %timeit pd.DataFrame(df1['x,y'].values.tolist(), index=df1['id']).stack().reset_index(level=1, drop=True).reset_index(name='x,y') 
1000 loops, best of 3: 1.49 ms per loop 
 
In [55]: %timeit pd.DataFrame({'id': np.repeat(df1['id'].values, df1['x,y'].str.len()), 'x,y': df1['x,y'].values.sum()}) 
1000 loops, best of 3: 562 µs per loop 
 
#piRSquared solution 
In [56]: %timeit pd.DataFrame({'id': df1['id'].repeat(df1['x,y'].str.len()), 'x,y': df1['x,y'].sum() }) 
1000 loops, best of 3: 712 µs per loop