在pandas DataFrame中组合多种数据类型

时间:2014-03-28 18:52:35

标签: python numpy pandas

我希望根据数据是否为数字来组合数据框中的列,例如:

import pandas as pd
import numpy as np

x = {'a':[1,2], 'b':['foo','bar'],'c':[np.pi,np.e]}
y = pd.DataFrame.from_dict(x)
y.apply(lambda x: x.sum() if x.dtype in (np.int64,np.float64) else x.min())

这给出了所需的输出,但似乎应该有一个更好的方法来写最后一行 - 是否有一种简单的方法来检查数字是否是一个numpy标量类型而不是检查dtype是否在指定的numpy dtypes列表?

2 个答案:

答案 0 :(得分:2)

您可以使用isscalar

y.apply(lambda x: x.sum() if np.isscalar(x) else x.min())

答案 1 :(得分:2)

我可能会检查每个列是否具有简单列表理解的数字,并将这些路径分开,然后将它们连接起来,而不是在此处进行应用。对于较大的帧,这将更有效。

In [11]: numeric = np.array([dtype in [np.int64, np.float64] for dtype in y.dtypes])

In [12]: numeric
Out[12]: array([True, False, True])

可能有is_numeric_dtype个功能,但我不知道它在哪里..

In [13]: y.iloc[:, numeric].sum()
Out[13]: 
a    3.000000
c    5.859874
dtype: float64

In [14]: y.iloc[:, ~numeric].min()
Out[14]: 
b    bar
dtype: object

现在你可以连接这些并可能重新索引:

In [15]: pd.concat([y.iloc[:, numeric].sum(), y.iloc[:, ~numeric].min()]).reindex(y.columns)
Out[15]: 
a           3
b         bar
c    5.859874
dtype: object