我想将值分配给数据帧的对角线。我能想到的最快的方法是使用numpy的np.diag_indices
并在values
数组上进行切片分配。但是,值数组只是一个视图,并且当数据帧为单个dtype
时可以接受赋值
考虑数据框d1
和d2
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
时使其失败。我该如何测试呢?我是否应该相信,如果是,通过视图进行的分配将始终有效?
答案 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])