提问人:David Jackson 提问时间:2/9/2020 最后编辑:David Jackson 更新时间:2/25/2020 访问量:97
Python 拆分行和列
python splitting the rows and columns
答:
3赞
Sergey Bushmanov
2/9/2020
#1
假设我们有一个 df:
df
Column1 Column2 Column3
0 1 A1 A2
1 2 B1 B2
然后我们可以做:
df["Column4"] = df.apply(lambda x: [x[1],x[2]], axis=1)
df = df.explode("Column4")
print(df)
Column1 Column2 Column3 Column4
0 1 A1 A2 A1
0 1 A1 A2 A2
1 2 B1 B2 B1
1 2 B1 B2 B2
如果内容是一个问题,我们可以更进一步:Column1
df["Column1"] = range(1, df.shape[0]+1)
print(df)
Column1 Column2 Column3 Column4
0 1 A1 A2 A1
0 2 A1 A2 A2
1 3 B1 B2 B1
1 4 B1 B2 B2
评论
0赞
David Jackson
2/9/2020
如果我执行一次代码,它很好,如果执行多次,它会产生双倍的结果
0赞
Sergey Bushmanov
2/9/2020
@Himavari原因,它应该运行一次,因为在执行过程中发生了突变。如果你想再次运行它,你需要从头开始,并按照OP中给出的方式重新定义你。df
df
2赞
anky
2/9/2020
#2
这是另一种不使用 df.stack 、 series.droplevel
后跟 df.join
的方法:apply
m = df.set_index('Column1')
m = m.join(m.stack().droplevel(1).to_frame('Column4')).reset_index()
print(m)
Column1 Column2 Column3 Column4
0 1 A1 A2 A1
1 1 A1 A2 A2
2 2 B1 B2 B1
3 2 B1 B2 B2
1赞
ansev
2/9/2020
#3
另一种方法:
new_df = (df.reindex(df.index.repeat(len(df.columns)-1))
.assign(Column4 = df[df.columns.difference(['Column1'])].stack().values))
print(new_df)
Column1 Column2 Column3 Column4
0 1 A1 A2 A1
0 1 A1 A2 A2
1 2 B1 B2 B1
1 2 B1 B2 B2
评论