如何判断数据帧是否为混合类型?

时间:2017-10-17 15:50:51

标签: python pandas numpy

我想将值分配给数据帧的对角线。我能想到的最快的方法是使用numpy的np.diag_indices并在values数组上进行切片分配。但是,值数组只是一个视图,并且当数据帧为单个dtype时可以接受赋值

考虑数据框d1d2

d1 = pd.DataFrame(np.ones((3, 3), dtype=int), columns=['A', 'B', 'C'])
d2 = pd.DataFrame(dict(A=[1, 1, 1], B=[1., 1., 1.], C=[1, 1, 1]))
d1

   A  B  C
0  0  1  1
1  1  0  1
2  1  1  0
d2

   A    B  C
0  1  1.0  1
1  1  1.0  1
2  1  1.0  1

然后让我们得到我们的指数

i, j = np.diag_indices(3)

d1是一个dtype因此,这可行

d1.values[i, j] = 0
d1

   A  B  C
0  0  1  1
1  1  0  1
2  1  1  0

但不在d2

d2.values[i, j] = 0
d2

   A    B  C
0  1  1.0  1
1  1  1.0  1
2  1  1.0  1

我需要编写一个函数,并在df混合dtype时使其失败。我该如何测试呢?我是否应该相信,如果是,通过视图进行的分配将始终有效?

3 个答案:

答案 0 :(得分:13)

您可以使用内部_is_mixed_type方法

In [3600]: d2._is_mixed_type
Out[3600]: True

In [3601]: d1._is_mixed_type
Out[3601]: False

或者,选中唯一的dtypes

In [3602]: d1.dtypes.nunique()>1
Out[3602]: False

In [3603]: d2.dtypes.nunique()>1
Out[3603]: True

一些de-tour,is_mixed_type会检查blocks的合并方式。

In [3618]: len(d1.blocks)>1
Out[3618]: False

In [3619]: len(d2.blocks)>1
Out[3619]: True

In [3620]: d1.blocks    # same as d1.as_blocks()
Out[3620]:
{'int32':    A  B  C
 0  0  1  1
 1  1  0  1
 2  1  1  0}

In [3621]: d2.blocks
Out[3621]:
{'float64':      B
 0  1.0
 1  1.0
 2  1.0, 'int64':    A  C
 0  1  1
 1  1  1
 2  1  1}

答案 1 :(得分:3)

def check_type(df):
  return len(set(df.dtypes)) == 1

 def check_type(df):
   return df.dtypes.nunique() == 1

答案 2 :(得分:1)

您可以检查DataFrame.dtypes以检查列的类型。例如:

>>> d1.dtypes
A    int64
B    int64
C    int64
dtype: object
>>> d2.dtypes
A      int64
B    float64
C      int64
dtype: object

鉴于至少有一列,您可以通过以下方式检查:

np.all(d1.dtypes == d1.dtypes[0])

对于您的数据框:

>>> np.all(d1.dtypes == d1.dtypes[0])
True
>>> np.all(d2.dtypes == d2.dtypes[0])
False

您当然可以先检查是否至少有一列。所以我们可以构造一个函数:

def all_columns_same_type(df):
    dtypes = df.dtypes
    return not dtypes.empty and np.all(dtypes == dtypes[0])
相关问题