将具有混合整数的列拆分为多列的元组

我有一个DF


   a     b   

0  (0,1) 1

1  1     (1,2)

2  2     3

所需的输出是:


    w  x  y  z

0   0  1  1  0

1   1  0  1  2

2   2  0  3  3

问题是,元组可以有多个不同的长度。以下 tolist() 仅适用于长度为 2 的元组,不适用于混合列。


df[['w', 'x']]=pd.DataFrame(df['a'].tolist(), index=df.index) 

有任何想法吗?提前致谢。


森林海
浏览 126回答 2
2回答

慕的地10843

想法是添加元组 if 标量然后创建新列:def f(col):    return pd.DataFrame([x if isinstance(x, tuple) else (x, )                         for x in col]).fillna(0).astype(int)df[['w', 'x']]=df.pop('a').pipe(f)df[['y', 'z']]=df.pop('b').pipe(f)print (df)   w  x  y  z0  0  1  1  01  1  0  1  22  2  0  3  0更通用的解决方案concat:dfs= [pd.DataFrame([x if isinstance(x, tuple) else (x, ) for x in df.pop(c)],                     index=df.index) for c in df.columns]df = pd.concat(dfs, axis=1, ignore_index=True).fillna(0).astype(int)print (df)   0  1  2  30  0  1  1  01  1  0  1  22  2  0  3  0

大话西游666

您可以转换为,然后str转换strip为()split,>>> df[['w', 'x']] = pd.DataFrame(df.pop('a')                                    .astype(str)                                    .str.strip('(/)')                                    .str.split(',')                                    .tolist()).fillna(0).astype(int)>>> df[['y', 'z']] = pd.DataFrame(df.pop('b')                                    .astype(str)                                    .str.strip('(/)')                                    .str.split(',')                                    .tolist()).fillna(0).astype(int)>>> df   w  x  y  z0  0  1  1  01  1  0  1  22  2  0  3  0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python