熊猫-如何根据数据类型堆叠列?

时间:2019-08-01 14:59:34

标签: python pandas stack pivot

如果我的数据框只有两个数据类型,如下所示:

d = {'col1': [1, 2], 'col2': ['jack', 'bill'], 'col3': [4, 5], 'col4': ['megan', 'sarah']}
df = pd.DataFrame(data=d)
print(df)


   col1  col2  col3   col4
0     1  jack     4  megan
1     2  bill     5  sarah


print(df.dtypes)

col1     int64
col2    object
col3     int64
col4    object

是否有一种仅基于数据类型来堆叠这些列的方法?最终结果将是:

   col1  col2
0     1  jack
1     2  bill
2     4  megan
3     5  sarah

最后一列的名称不必保持相同。

3 个答案:

答案 0 :(得分:4)

这适用于您的示例数据,不确定是否适用于常规数据

(df.groupby(df.dtypes, axis=1)
   .apply(lambda x: (x.stack().reset_index(drop=True)))
)

输出

int64   object
0   1   jack
1   4   megan
2   2   bill
3   5   sarah

答案 1 :(得分:3)

为什么不给循环机会

pd.DataFrame([ df.loc[:,df.dtypes==x].values.ravel() for x in df.dtypes.unique()]).T
Out[46]: 
   0      1
0  1   jack
1  4  megan
2  2   bill
3  5  sarah

答案 2 :(得分:2)

对于dtype列数不匹配的情况,可以使用默认构造函数。在groupby(axis=1)上借用Quang的想法,

pd.DataFrame(df.groupby(df.dtypes, axis=1).apply(lambda s: list(s.values.ravel())).tolist()).T