查找所有列的范围(最大值和最小值之间的差异),同时优雅地处理字符串列

时间:2018-12-25 14:36:29

标签: python string pandas dataframe

我有一种情况,我必须在数据集中查找所有列的范围,该数据集中包含具有数字值的多列,但其中一列具有字符串值。 请从下面的数据集中找到示例记录:

import seaborn as sns
iris = sns.load_dataset('iris')

   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa

这些列的最大值和最小值由

给出
sepal_length          7.9
sepal_width           4.4
petal_length          6.9
petal_width           2.5
species         virginica
dtype: object

sepal_length       4.3
sepal_width          2
petal_length         1
petal_width        0.1
species         setosa
dtype: object

...分别。要查找所有列的范围,我可以使用以下代码:

iris.max() - iris.min()

但是由于“ species”列具有字符串值,因此上面的代码引发了以下错误:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

如果发生上述错误,我想将值打印为

"{max string value}" - "{min string value}"

IOW,我的预期输出如下:

sepal_length                   3.6
sepal_width                    2.4
petal_length                   5.9
petal_width                    2.4
species         virginica - setosa

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

分别处理数字和字符串列。您可以使用df.select_dtypes选择它们。最后,concat结果。

u = Iris.select_dtypes(include=[np.number])
# U = u.apply(np.ptp, axis=0)
U = u.max() - u.min()

v = Iris.select_dtypes(include=[object])
V = v.max() + ' - ' + v.min()

U.append(V)

sepal_length                   3.6
sepal_width                    2.4
petal_length                   5.9
petal_width                    2.4
species         virginica - setosa
dtype: object