Python 之 Pandas DataFrame 数据类型的行操作和常用属性和方法汇总

news/2024/3/28 20:41:03/文章来源:https://blog.csdn.net/weixin_45891612/article/details/129120824

文章目录

  • 一、DataFrame 行操作
    • 1. 标签选取
    • 2. 数值型索引和切片
    • 3. 切片操作多行选取
    • 4. 添加数据行
      • 4.1 追加字典
      • 4.2 追加列表
    • 5. 删除数据行
  • 二、常用属性和方法汇总
    • 1. 转置
    • 2. axes
    • 3. dtypes
    • 4. empty
    • 5. columns
    • 6. shape
    • 7. values
    • 8. head() & tail()
    • 9. 修改列名 rename()
    • 10. info() 函数
    • 11. df. sort_index() 函数
    • 12. df.sort_values() 函数

  • DataFrame 是 Pandas 的重要数据结构之一,也是在使用 Pandas 进行数据分析过程中最常用的结构之一,可以这么说,掌握了 DataFrame 的用法,你就拥有了学习数据分析的基本能力。
  • 在开始之前,我们需要先引入 numpy 和 pandas 库。
import numpy as np​
import pandas as pd

一、DataFrame 行操作

  • 在我们理解了前文的列索引操作后,行索引操作就变的简单。
  • 具体列索引操作详见 Python 之 Pandas DataFrame 数据类型的简介、创建的列操作。

1. 标签选取

  • 行操作需要借助 loc 属性来完成:按标签或布尔数组访问一组行和列。
  • 首先,我们定义一个字典,作为初始数据,创建 DataFrame 数据结构。
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print("===========df原始数据========")
print(df)
#===========df原始数据========
#    one  two
# a  1.0    1 
# b  2.0    2 
# c  3.0    3 
# d  NaN    4
  • 然后,我们确定标签为 b 的数据。
print("===========标签为b的数据========")
print(df.loc['b'])
#===========标签为b的数据========
#one    2.0
#two    2.0
#Name: b, dtype: float64
  • 这里需要注意的是,loc 允许接受两个参数分别是行和列。
  • 例如,我们选取 b 行 one 列交叉的数据。
df.loc['b',"one"]
#2.0
  • 除此之外,行和列还可以使用切片。
  • 例如,标签为 b 的行到标签为 d 的行, 对应标签为 one 的列。
  • 这里需要注意的是,使用行标签切片,是包含结束的行。
df.loc['b':'d',"one"]   # 注意
#b    2.0
#c    3.0
#d    NaN
#Name: one, dtype: float64
  • 用过 loc 索引的行和列与 numpy 整数数组索引的区别如下,loc 是通过标签进行取值,他有两个参数,第一个代表行,第二个代表列。
df.loc[['a','b'],["one","two"]]
#   one	 two
#a	1.0	   1
#b	2.0	   2
  • 我们可以通过 np.arange( ).reshape( ) 生成一个从 0 到 1 的三行四列的指定元素数组,然后调用其中第一行和第一列,第三行和第四列分别相交的数据。
s = np.arange(12).reshape((3,4))
s
#array([[ 0,  1,  2,  3],
#          [ 4,  5,  6,  7], 
#          [ 8,  9, 10, 11]])
s[[0,2],[0,3]]
#array([ 0, 11])

2. 数值型索引和切片

  • 使用数据型索引,需要使用 iloc 属性。
  • 直接使用索引,会优先查找的是列标签,如果找不到会报错,列没有位置索引。
  • 可以使用 iloc,行基于整数位置的按位置选择索引。
  • 例如,我们指定 data 数据,然后定义行标签,通过字典创建 DataFrame。
data = {'Name':['关羽', '刘备', '张飞', '曹操'],'Age':[28,34,29,42]}
index = ["rank1", "rank2", "rank3", "rank4"]
df = pd.DataFrame(data, index=index)
df
#       Name   Age
#rank1	关羽	28
#rank2	刘备	34
#rank3	张飞	29
#rank4	曹操	42
  • 然后,我们取得位置索引为 2 的数据。
df.iloc[2]
#Name    张飞
#Age     29
#Name: rank3, dtype: object
  • 我们也可以同时取得位置索引分别为 0 和 2 的数据。
df.iloc[[0,2]]
Name	Age
rank1	关羽	28
rank3	张飞	29
  • 我们也可以选择行索引为 0,列索引为 1 的数据。
df.iloc[0,1]
#28
  • 这里需要注意的是,loc 使用的是标签索引,iloc 使用的是位置索引,两者不能混用,比如在 loc 中使用位置索引,或者在 iloc 中使用标签索引。
  • 常见有如下的错误写法:loc 当中使用了 1 这个位置索引,iloc 当中使用了 Name 这个标签索引。
#df.loc[1,"Name"]
#df.iloc[1,"Name"]

3. 切片操作多行选取

  • 可以直接使用数值型切片操作行,和使用 iloc 同样的结果。
  • 例如,我们指定 data 数据,然后定义行标签,通过字典创建 DataFrame。
data = {'Name':['关羽', '刘备', '张飞', '曹操'],'Age':[28,34,29,42]}
index = ["rank1", "rank2", "rank3", "rank4"]
df = pd.DataFrame(data, index=index)
df
#       Name    Age
#rank1	关羽	28
#rank2	刘备	34
#rank3	张飞	29
#rank4	曹操	42
  • 然后,我们取得取得位置索引从 1 到 3 的行,但是不包含第 3 行的数据。
print("=====df.iloc[1:3]:=======")
print(df.iloc[1:3])
#=====df.iloc[1:3]:=======
#      Name  Age
#rank2   刘备   34
#rank3   张飞   29
  • 我们使用切片可以直接提取行。
print("=====df[1:3]:=======")
print(df[1:3])
#=====df[1:3]:=======
#        Name  Age
#rank2   刘备   34
#rank3   张飞   29

4. 添加数据行

  • 使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行.
  • 其语法模板如下:
df.append(other, ignore_index=False, verify_integrity=False, sort=False)
  • 将 other 追加到调用者的末尾,返回一个新对象。other 行中不在调用者中的列将作为新列添加。
  • 其参数含义如下:
  • other 表示 DataFrame 或 Series/dict 类对象,或这些对象的列表。
  • ignore_index 默认为 False,如果为 True 将不适用 index 标签。
  • verify_integrity 默认为 False ,如果为 True,则在创建具有重复项的索引时引发 ValueError。
  • sort 表示排序。
  • 例如,我们可以生成一个指定数据的数组,并于后续的操作观察。
data = {'Name':['关羽', '刘备', '张飞', '曹操'], 'Age':[28, 34, 29, 42],"Salary":[5000, 8000, 4500, 10000]}
df = pd.DataFrame(data)
df
#	Name	Age	 Salary
# 0	关羽	28 	  5000
# 1	刘备	34	  8000 
# 2	张飞	29	  4500
# 3	曹操	42	  10000

4.1 追加字典

  • 我们在行末新加一个数据行,此时,我们需要添加 ignore_index=True,否则会报错。例如下述操作。
d2 = {"Name":"诸葛亮", "Age":30}
df3 = df.append(d2)
print(df3)
  • 错误提示:Can only append a Series if ignore_index=True or if the Series has a name。
  • 这是因为仅当 ignore_index=True 或序列有名称时,才能追加序列。
d2 = {"Name":"诸葛亮", "Age":30}
df3 = df.append(d2, ignore_index=True) # 需要添加 
print(df3)
#    Name    Age   Salary
#0   关羽     28   5000.0
#1   刘备     34   8000.0
#2   张飞     29   4500.0
#3   曹操     42   10000.0
#4   诸葛亮   30   NaN
  • 或者 Series 数据当中有 name。
d2 = {"Name":"诸葛亮", "Age":30}​
s = pd.Series(d2, name="a")
print(s)
df3 = df.append(s)
print(df3)
#Name    诸葛亮 
#Age      30 
#Name: a, dtype: object
#    Name    Age   Salary 
#0   关羽     28   5000.0 
#1   刘备     34   8000.0 
#2   张飞     29   4500.0 
#3   曹操     42   10000.0 
#a  诸葛亮   30   NaN

4.2 追加列表

  • 如果 list 是一维的,则以列的形式追加。
  • 如果 list 是二维的,则以行的形式追加。
  • 如果 list 是三维的,只添加一个值。
  • 这里需要注意的是,使用 append 可能会出现相同的 index,想避免的话,可以使用 ignore_index=True。
  • 首先,我们生成输出数据数组,便于后续的观察操作。
data = [[1, 2, 3, 4],[5, 6, 7, 8]]              
df = pd.DataFrame(data)
print(df)
#   0  1  2  3
#0  1  2  3  4
#1  5  6  7  8
  • (1) 当 list 是一维的,则以列的形式追加。
a_l = [10,20]​
df3 = df.append(a_l)
print(df3)
#    0    1    2    3
#0   1  2.0  3.0  4.0 
#1   5  6.0  7.0  8.0 
#0  10  NaN  NaN  NaN 
#1  20  NaN  NaN  NaN
  • (2) 当 list 是二维的,则以行的形式追加。
a_l = [[10,"20",30],[2,5,6]]
df4 = df.append(a_l) 
print(df4)
#    0   1   2    3
#0   1   2   3  4.0 
#1   5   6   7  8.0 
#0  10  20  30  NaN 
#1   2   5   6  NaN
  • 此时,我们会发现行标签有点不太对,因此我们使用 ignore_index=True。
print("=========使用:ignore_index=True===========")
df5 = df.append(a_l,ignore_index=True) # 需要添加 
print(df5)
#=========使用:ignore_index=True===========
#     0   1   2    3 
#0   1   2   3  4.0 
#1   5   6   7  8.0 
#2  10  20  30  NaN 
#3   2   5   6  NaN
  • 在这里需要注意的是,append 不改变原数据,是生成一个新数据。

5. 删除数据行

​- 可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。示例如下:

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])​
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])​
df = df.append(df2)
print("=======源数据df=======")
print(df)
#=======源数据df=======
#   a  b 
#0  1  2 
#1  3  4 
#0  5  6 
#1  7  8
  • 注意此处调用了 drop() 方法,drop 默认不会更改源数据,而是返回另一个dataframe来存放删除后的数据。
  • (1) drop 函数默认删除行,列需要加 axis = 1。
  • (2) 当 inplace 为 False 时不会修改源数据,为 True 时会修改源数据。
df1 = df.drop(0)
print("=======修改后数据df1=======")
print(df1)
=======修改后数据df1=======
#    a  b 
#1  3  4 
#1  7  8

二、常用属性和方法汇总

名称属性&方法描述
T行和列转置。
axes返回一个仅以行轴标签和列轴标签为成员的列表。
dtypes返回每列数据的数据类型。
emptyDataFrame中没有数据或者任意坐标轴的长度为0,则返回True
columns返回DataFrame所有列标签
shape返回一个元组,获取行数和列数,表示了 DataFrame 维度。
sizeDataFrame中的元素数量。
values使用 numpy 数组表示 DataFrame 中的元素值。
head()返回前 n 行数据。
tail()返回后 n 行数据。
rename()rename(columns=字典) ,修改列名
info()可以显示信息,例如行数/列数,总内存使用量,每列的数据类型以及不缺少值的元素数
sort_index()默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
sort_values()既可以根据列数据,也可根据行数据排序
  • 我们先生成一个初始数据数组,用以后续的观察操作。
data = {'Name':['关羽', '刘备', '张飞', '曹操'], 'Age':[28, 34, 29, 42],"Salary":[5000, 8000, 4500, 10000]}
df = pd.DataFrame(data)
df
#	Name	Age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000

1. 转置

  • 返回 DataFrame 的转置,也就是把行和列进行交换,但是源数据是不会发生任何变化的。
df.T0	   1	   2	   3
Name	关羽	刘备	张飞	曹操 
Age	      28	  34	  29	  42 
Salary	5000	8000	4500   10000	

2. axes

  • 返回一个行标签、列标签组成的列表。
print(df.axes)
[df.index,df.columns]
#[RangeIndex(start=0, stop=4, step=1), Index(['Name', 'Age', 'Salary'], dtype='object')]

3. dtypes

  • 返回 Series 每一列的数据类型。示例如下:
df.dtypes
Name      object
Age           int64
Salary       int64
dtype: object

4. empty

  • 返回一个布尔值,判断输出的数据对象是否为空,若为 True 表示对象为空。
df.empty
#False
  • 我们创建一个空的 DataFrame。
empty_df = pd.DataFrame()
empty_df.empty 
#True
  • 如果给 DataFrame 数据类型直接判断真假,则会报错: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

5. columns

  • 返回 DataFrame 所有列标签。
df.columns
#Index(['Name', 'Age', 'Salary'], dtype='object')
  • 我们也可以通过 df.columns 的个数获取 DataFrame 当中列的个数。
len(df.columns)
#3
df.columns.size
#3

6. shape

  • 返回一个元组,获取行数和列数,表示了 DataFrame 维度。
df.shape
#(4,3)
row_num,column_num = df.shape
print(row_num,column_num )
#4 3

7. values

  • 以 ndarray 数组的形式返回 DataFrame 中的数据。
df.values
#array([['关羽', 28, 5000], 
#          ['刘备', 34, 8000],        
#          ['张飞', 29, 4500],        
#          ['曹操', 42, 10000]], dtype=object)

8. head() & tail()

  • 我们可以使用 head() 获取前几行数据。
df.head(3)
#	Name	Age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500
  • 我们也可以使用 tail() 获取后几行数据。
df.tail(3)
#	Name	Age	Salary 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000

9. 修改列名 rename()

  • 其语法模板如下:
DataFrame.rename(index=None, columns=None, inplace=False)
  • 其参数含义如下:
  • index 表示修改后的行标签。
  • columns 表示修改后的列标签。
  • inplace 表示默认为 False,不改变源数据,返回修改后的数据,True 更改源数据。
  • 先输出原始数据,便于操作和观察。
df
#	Name	Age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000
  • 我们可以修改变量 df 的行标签。
df.rename(index={1:"row2", 2:"row3"})
df
#	Name	Age	Salary 
#0	关羽	28	5000 
#row2	刘备	34	8000 
#row3	张飞	29	4500 
#3	曹操	42	10000
  • 我们可以修改变量 df 的列标签。
df.rename(columns = {"Name":"name", "Age":"age"})
df
#	name	age	Salary 
#0	关羽	28	5000 
#1	刘备	34	8000 
#2	张飞	29	4500 
#3	曹操	42	10000
  • 如果我需要修改源数据的话,添加 inplace 参数。
df.rename(index={1:"row2", 2:"row3"}, columns = {"Name":"name", "Age":"age"}, inplace=True)
df
#	name	age	Salary 
#0	关羽	28	5000 
#row2	刘备	34	8000 
#row3	张飞	29	4500 
#3	曹操	42	10000

10. info() 函数

  • 用于打印 DataFrame 的简要摘要,显示有关 DataFrame 的信息,包括索引的数据类型 dtype 和列的数据类型 dtype,非空值的数量和内存使用情况。
  • 首先,我们创建一组数据,将数据追加到 df 数据中。
data = {"name":"诸葛亮","age":30}
df = df.append(data, ignore_index =True)
df
#	name	age	Salary 
#0	关羽	28	5000.0 
#1	刘备	34	8000.0 
#2	张飞	29	4500.0 
#3	曹操	42	10000.0 
#4	诸葛亮	30	NaN
  • 然后使用 info() 函数。
df.info()
#<class 'pandas.core.frame.DataFrame'> 
#RangeIndex: 5 entries, 0 to 4 
#Data columns (total 3 columns):  
##   Column  Non-Null Count  Dtype   
#---  ------  --------------  -----    
#0   name    5 non-null      object   
#1   age     5 non-null      int64    
#2   Salary  4 non-null      float64 
#dtypes: float64(1), int64(1), object(1) 
#memory usage: 248.0+ bytes
  • 我们来看一看都有些什么信息:
  • (1) <class ‘pandas.core.frame.DataFrame’> 表示数据类型为 DataFrame。
  • (2) RangeIndex: 5 entries, 0 to 4 表示有 5 条数据(也就是 5 行),索引为 0-4。
  • (3) Data columns (total 3 columns) 表示该数据帧有 3 列。
  • (4)# 表示索引号,不用太在意。
  • (5) column 表示每列数据的列名。
  • (6) Non-Null count 表示每列数据的数据个数,缺失值 NaN 不作计算。可以看出上面 Salary 列数据有缺失值。
  • (7) Dtype 表示数据的类型。
  • (8) dtypes 表示float64(1), int64(1), object(1): 数据类型的统计。
  • (9) memory usage 表示 248.0+ bytes: 该数据帧占用的运行内存(RAM)。

11. df. sort_index() 函数

  • 默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
  • 其语法模板如下:
sort_index(axis=0, ascending=True, inplace=False)
  • 其参数含义如下:
  • axis:0 表示按照行名排序;1 表示按照列名排序。
  • ascending:默认 True 升序排列;False 降序排列。
  • inplace:默认 False,否则排序之后的数据直接替换原来的数据。
  • 需要注意的是,df.sort_index() 可以完成和 df.sort_values() 完全相同的功能,但 python 更推荐用只用 df.sort_index() 对根据行标签和根据列标签排序,其他排序方式用 df.sort_values()。
df = pd.DataFrame({'b':[1,2,2,3],'a':[4,3,2,1],'c':[1,3,8,2]},index=[2,0,1,3])  
df 
#    b	a	c 
#2	1	4	1 
#0	2	3	3 
#1	2	2	8 
#3	3	1	2 
  • 我们默认按行标签升序排序,或 df.sort_index(axis=0, ascending=True)。
df.sort_index()
#    b	a	c 
#0	2	3	3 
#1	2	2	8 
#2	1	4	1 
#3	3	1	2 
  • 我们按列标签升序排序
df.sort_index(axis=1)
#   a	b	c 
#2	4	1	1 
#0	3	2	3 
#1	2	2	8 
#3	1	3	2 

12. df.sort_values() 函数

  • 既可以根据列数据,也可根据行数据排序。
  • 其语法模板如下:
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
  • 其参数含义如下:
  • by:str or list of str;如果 axis=0,那么 by=“列名”;如果 axis=1,那么 by=“行名”。
  • axis:{0 or ‘index’, 1 or ‘columns’},default 0,默认按照列排序,即纵向排序;如果为 1,则是横向排序。
  • ascending:布尔型,True 则升序,如果 by=[‘列名1’,‘列名2’],则该参数可以是 [True, False],即第一字段升序,第二个降序。
  • inplace:布尔型,是否用排序后的数据框替换现有的数据框。
  • na_position:{‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面。
  • 需要注意的是,必须指定 by 参数,即必须指定哪几行或哪几列;无法根据 index 名和 columns 名排序(由.sort_index()执行)。
    ​- 我们先生成源数据。
df = pd.DataFrame({'b':[1,2,3,2],'a':[4,3,2,1],'c':[1,3,8,2]},index=[2,0,1,3]) 
df
#	b	a	c 
#2	1	4	1 
#0	2	3	3 
#1	3	2	8 
#3	2	1	2
  • (1) 按 b 列升序排序。
  • 等同于 df.sort_values(by=‘b’,axis=0)。
df.sort_values(by='b') 
print(df)
#	b	a	c 
#2	1	4	1 
#0	2	3	3 
#3	2	1	2 
#1	3	2	8
  • (2) 先按 b 列降序,再按 a 列升序排序。
  • 等同于 df.sort_values(by=[‘b’,‘a’],axis=0,ascending=[False,True])。
df.sort_values(by=['b','a'],ascending=[False,True]) 
print(df)
#   b	a	c 
#1	3	2	8 
#3	2	1	2 
#0	2	3	3 
#2	1	4	1
  • (3) 按行 3 升序排列。
df.sort_values(by=3,axis=1)
print(df)
#	a	b	c 
#2	4	1	1 
#0	3	2	3 
#1	2	3	8 
#3	1	2	2
  • (4) 按行 3 升序,行 0 降排列。
df.sort_values(by=[3,0],axis=1,ascending=[True,False])
print(df)
#	a	b	c 
#2	4	1	1 
#0	3	3	2 
#1	2	8	3 
#3	1	2	2
  • 需要注意的是,指定多列(多行)排序时,先按排在前面的列(行)排序,如果内部有相同数据,再对相同数据内部用下一个列(行)排序,以此类推。
  • 如果内部无重复数据,则后续排列不执行。即首先满足排在前面的参数的排序,再排后面参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72058.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术干货!如何玩转Salesforce测试类 (Test Class)?

测试类主要用于评估其他代码片段&#xff0c;确保一切正常且可靠地运行。这可以作为一种早期预警系统&#xff0c;提醒开发人员出现了错误或问题。 不同类型的程序化测试 测试类可以分为多种不同的类型&#xff0c;这改变了我们编写测试的方式及其预期结果。对于Apex测试类&…

R语言实现可理解的随机森林模型(Random Forest)——iml包

Random Forest 解释模型1. 介绍2. 理解随机森林运行机理2.1导入需要的包2.2 构建随机森林模型2.3 RF特征重要性&#xff1a;2.4 特征对预测结果的影响2.5 交互作用2.6 替代模型&#xff08;Decision tree surrogate model&#xff09;2.71. 介绍 机器学习模型通常可以很好地进…

儿童袖套上架美国亚马逊CPC认证

袖套&#xff0c;也称套袖。是戴在袖管外的套子&#xff0c;旨在保护衣服的袖管。通常戴时松垂于另外一只衣袖外面的袖子。美国CPC认证简介&#xff1a;CPC认证是Children’s Product Certificate的英文简称&#xff0c;CPC证书就类似于国内的质检报告&#xff0c;在通过相关检…

内网渗透(四十五)之横向移动篇-WinRM远程执行命令横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

PrivateLoader PPI服务发现RisePro恶意软件窃取分发信息

称为PrivateLoader的按安装付费&#xff08;PPI&#xff09;软件下载器服务正用于恶意软件RisePro的信息窃取。Flashpoint 于 2022 年 12月13日发现了新的窃取者&#xff0c;此前发现了在名为Russian Market的非法网络犯罪市场上使用该恶意软件泄露的“几组日志”。RisePro是一…

IDEA高效插件和设置

安装好Intellij idea之后&#xff0c;进行如下的初始化操作&#xff0c;工作效率提升十倍。 一. 安装插件 1. Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句&#xff0c;这也太智能了&#xff0c;还显示了每条语句使用频率。 原因是它学习了我的项目代码&…

墨菲安全参与信息通信软件供应链安全社区成员大会并获自主研发创新成果奖

2023年2月16日&#xff0c;首届ICT软件供应链安全治理论坛暨信息通信软件供应链安全社区第二届成员大会在北京成功举办&#xff0c;多位业界顶级专家与工业和信息化部网络安全管理局相关领导出席&#xff0c;为现场观众分享了关于软件供应链可持续性与安全治理行业的前瞻与思考…

Apache Shiro与Spring Security对比

Apache Shiro VS Spring Security 1.Spring Security 官方文档&#xff1a;https://spring.io/projects/spring-security#overview介绍&#xff1a; Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spr…

CAS底层原理及ABA问题

一、案例CAS是Java中Unsafe类里面的一个方法&#xff0c;它的全称是叫CompareAndSwap比较并交换的一个意思&#xff0c;它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。例如&#xff0c;比如说像这样一个场景&#xff0c;有一个成员变量state&#xf…

【分享】订阅卖家云集简云连接器同步销售出库数据至卖家云系统

方案场景 在企业进行数字化转型过程中&#xff0c;数据割裂是企业面临的最大困难&#xff0c;钉钉作为现企业流行的常用办公系统&#xff0c;与第三方ERP系统之间存在着数据割裂的现象&#xff0c;例如&#xff0c;钉钉与卖家云系统&#xff0c;企业员工原来的办公方式是在钉钉…

Vue基础14之TodoList组件自定义事件、全局事件总线、TodoList全局事件总线

Vue基础14TodoList-组件自定义事件先改Header和Footer子组件&#xff0c;List先不考虑App.vueMyHeader.vueMyFooter.vue全局事件总线实现思路正规写法main.jsApp.vueStudent.vueSchool.vue总结&#xff1a;全局事件总线&#xff08;GlobalEventBus&#xff09;TodoList案例&…

修复 K8s SSL/TLS 漏洞(CVE-2016-2183)指南

作者&#xff1a;老 Z&#xff0c;中电信数智科技有限公司山东分公司运维架构师&#xff0c;云原生爱好者&#xff0c;目前专注于云原生运维&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 测试服务器配置 主机名IPCPU内存系…

5.10 BGP属性-MED

5.4.4配置BGP MED属性控制选路 1. 实验目的 熟悉BGP MED属性控制选路的应用场景掌握BGP MED属性控制选路的配置方法2. 实验拓扑 实验拓扑如图5-10所示: 图5-10:配置BGP MED属性控制选路 3. 实验步骤 (1) 网络连通性 R1…

QMap 判断是否value是否已经存在,结合Sleep函数测试

网上查了资料&#xff0c;基本说的都是通过.value判断是否已经之前的key值&#xff0c;但是尝试.了一下发现有.key的函数&#xff0c;对比着来就感觉这个函数是用来判断是否已经存在value值&#xff0c;于是开始百度也几乎没有找到相关资料&#xff0c;只好自己看官方文档&…

【高速电路01】高速电路入门知识

1.什么是高速电路&#xff1f; 一般情况下&#xff0c;我们在讨论电路的特性时&#xff0c;一个基本的常识&#xff0c;是认为一条导线上各处的电压&#xff08;或者说信号&#xff09;在同一时刻是相等的。 以上结论在低速电路时是没问题的&#xff0c;但是&#xff0c;实际…

R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作技术应用第一章、理论篇以问题导入的方式&#xff0c;深入掌握原理基础什么是MaxEnt模型&#xff1f;MaxEnt模型的原理是什么&#xff1f;有哪些用途&#xff1f;MaxEnt运行需要哪些输入文件…

【异常】记一次因注解@RestController没加(@RestController不会用),导致无法调用Controller层的方法

一、背景 我想要调用一个Controller&#xff0c;定义的内容如下 RequestMapping("/demo") public class demoController {GetMapping("/doSomething")public JSONObject doSomething() {JSONObject json new JSONObject();json.set("title", …

界面控件DevExpress WPF Pivot Grid——拥有强大多维数据分析能力!

界面控件DevExpress WPF的Pivot Grid组件是一个类似excel的数据透视表&#xff0c;用于多维数据分析和跨选项卡报表生成。它拥有众多的布局自定义选项&#xff0c;允许开发者完全控制其UI且以用户为中心的功能使其易于部署。PS&#xff1a;DevExpress WPF拥有120个控件和库&…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”&#xff0c;单因素方差分析只是考虑了一个自变量&#xff08;定类&#xff09;与一个因变量&#xff08;定量&#xff09;之间的关系&#xff0c;但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系&#xff0c;例如…

核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序

目录 1. 业务场景 -> 1.1 初始化操作 -> 1.2 业务操作 -> 1.3优势 2. 实现方式(多种方式,不同思想) -> 2.1 定时调度任务(常用四种方式 task ) --> 2.1.1 Timer(单线程) --> 2.1.2 scheduledExecutorService(多线程并发执行,线程池) --> 2.1…