Skip to main content
 首页 » 编程设计

python之使用该列中的值按特定列复制 Pandas 中的行

2025年05月04日23EasonJim

解决这个问题最有效的方法是什么?

i_have = pd.DataFrame(data={ 
  'id': ['A', 'B', 'C'], 
  'v' : [ 's,m,l',  '1,2,3',   'k,g'] 
}) 
 
i_need = pd.DataFrame(data={ 
  'id': ['A','A','A','B','B','B','C', 'C'], 
  'v' : ['s','m','l','1','2','3','k','g'] 
}) 

我想创建一个新的 df 并在遍历 i_have 时将记录附加到新的 df。但随着行数的增加,这可能需要一段时间。

请您参考如下方法:

使用numpy.repeat与 numpy.concatenate用于展平:

#create lists by split 
splitted = i_have['v'].str.split(',') 
#get legths of each lists  
lens = splitted.str.len() 
 
df = pd.DataFrame({'id':np.repeat(i_have['id'], lens), 
                    'v':np.concatenate(splitted)}) 
print (df) 
  id  v 
0  A  s 
0  A  m 
0  A  l 
1  B  1 
1  B  2 
1  B  3 
2  C  k 
2  C  g 

谢谢piRSquared对于重复多列的解决方案:

i_have = pd.DataFrame(data={ 
  'id': ['A', 'B', 'C'], 
  'id1': ['A1', 'B1', 'C1'], 
  'v' : [ 's,m,l',  '1,2,3',   'k,g'] 
}) 
print (i_have) 
  id id1      v 
0  A  A1  s,m,l 
1  B  B1  1,2,3 
2  C  C1    k,g 
 
splitted = i_have['v'].str.split(',') 
lens = splitted.str.len() 
 
df = i_have.loc[i_have.index.repeat(lens)].assign(v=np.concatenate(splitted)) 
print (df) 
  id id1  v 
0  A  A1  s 
0  A  A1  m 
0  A  A1  l 
1  B  B1  1 
1  B  B1  2 
1  B  B1  3 
2  C  C1  k 
2  C  C1  g