我有一个看起来像这样的数据框:
v1 v2
0 a A1
1 b A2,A3
2 c B4
3 d A5, B6, B7
我想修改此数据框,以使v2
列中具有多个值的任何行都被复制为v2
中的每个值。例如,对于上述数据框,结果如下:
v1 v2
0 a A1
1 b A2
2 b A3
3 c B4
4 d A5
5 d B6
6 d B7
我能够使用以下代码来做到这一点:
new_df = pd.DataFrame()
for index, row in df.iterrows():
if len(row["v2"].split(','))>1:
row_base = row
for r in row["v2"].split(','):
row_base["v2"] = r
new_df = new_df.append(row_base, ignore_index=True)
else:
new_df = new_df.append(row)
但是在大型数据框上它效率极低,我想学习如何更有效地做到这一点。
答案 0 :(得分:2)
使用Series.str.split
和DataFrame.explode
的0.25+版本的熊猫解决方案:
df = df.assign(v2 = df.v2.str.split(',')).explode('v2').reset_index(drop=True)
print (df)
v1 v2
0 a A1
1 b A2
2 b A3
3 c B4
4 d A5
5 d B6
6 d B7
对于较旧的版本,使用numpy的perfromace也应该更好:
from itertools import chain
s = df.v2.str.split(',')
lens = s.str.len()
df = pd.DataFrame({
'v1' : df['v1'].values.repeat(lens),
'v2' : list(chain.from_iterable(s.values.tolist()))
})
print (df)
v1 v2
0 a A1
1 b A2
2 b A3
3 c B4
4 d A5
5 d B6
6 d B7