如果我的数据框只有两个数据类型,如下所示:
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
最后一列的名称不必保持相同。
答案 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