我希望根据数据是否为数字来组合数据框中的列,例如:
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列表?
答案 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