2014-03-28 64 views
2

我想在一个数据帧取决于数据是否是数字或没有,例如列组合在一起:结合使用多种数据类型

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

而不是在这里做一个应用,我可能会检查每个列是否是数字用一个简单的列表中理解和分离这些路径,然后CONCAT他们回来。这对于较大的框架会更有效率。

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 

现在你可以Concat的这些并有可能重新索引:

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 
+2

'' df._get_numeric_data()'' – Jeff

+0

谢谢,你们俩。这个私人方法真的有用。 –

2

你可以使用isscalar

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