Python 熊猫-如何基于数据类型堆叠列?
如果我有一个只有两种数据类型的数据帧,如下所示:Python 熊猫-如何基于数据类型堆叠列?,python,pandas,stack,pivot,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.dtyp
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
最后的列名不必保持不变。这适用于示例数据,不确定是否适用于常规数据
(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
为什么不给一个循环的机会呢
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
对于数据类型列数不匹配的情况,可以使用默认构造函数。借用Quang关于groupby(axis=1)的想法
这是一个很好的解决方案。然而,由于循环,与其他解决方案相比,您的处理时间在更大的数据集上的伸缩性较差。因此,我正在使用的实际数据集有一个datetime列用于其中一个DYTPE。这对该列执行了一些奇怪的格式设置,并每天将行压缩成一行,这是一种奇怪的行为。我还没弄清楚原因yet@G.Anderson嗯,你确定吗?我一定是弄错了原因,但结果是它与行数成线性关系,而另一种解决方案则不是。在220行上:
36.9 ms
。在2200行上:315ms
。在22000行上:3.02s
只需进一步研究一下。我在real dataset中使用的两种数据类型实际上是datetime和float。我首先需要将我的数据框的axis=1
更改为columns
,但现在我收到了TypeError:unhabable type:“list”
,这很有趣,因为数据框内没有列表。我想知道如果每个数据类型的列数不匹配,会发生什么情况;)@拉斐尔这就是我的意思,当我说它一般来说可能不起作用。
pd.DataFrame(df.groupby(df.dtypes, axis=1).apply(lambda s: list(s.values.ravel())).tolist()).T