如何在Pandas DataFrame中取消测试列



我有以下问题,其中一列是对象(列表类型单元格(:

我不想使用explode(使用较旧版本的panda(。如何对具有三列的数据帧执行同样的操作?

df
A       B     C
0  1  [1, 2]     3
1  1  [1, 2]     4
2  2  [3, 4]     5

我的预期输出是:

A  B  C
0  1  1  3
1  1  2  3
3  1  1  4
4  1  2  4
5  2  3  5
6  2  4  5

我发现这两种方法很有用。如何将第三列添加到此代码中。

df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})

df=pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})

您将索引设置为要与您分解的列表绑定的所有列:

(df.set_index(['A', 'C'])['B']
.apply(pd.Series).stack()
.reset_index()
.drop(columns='level_2').rename(columns={0: 'B'}))
A  C  B
0  1  3  1
1  1  3  2
2  1  4  1
3  1  4  2
4  2  5  3
5  2  5  4

或者对于第二种方法也重复"C">

pd.DataFrame({'A': df.A.repeat(df.B.str.len()),
'C': df.C.repeat(df.B.str.len()),
'B': np.concatenate(df.B.to_numpy())})

您可以使用itertools来重塑数据:

from itertools import product,chain
pd.DataFrame(chain.from_iterable((product([a],b,[c])) 
for a,b,c in df.to_numpy()),
columns = df.columns)

A   B   C
0   1   1   3
1   1   2   3
2   1   1   4
3   1   2   4
4   2   1   5
5   2   4   5

最新更新