Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-如何基于数据类型堆叠列?_Python_Pandas_Stack_Pivot - Fatal编程技术网

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