(二)pandas处理丢失数据
处理丢失数据
有两种丢失数据:
- None
- np.nan(NaN)
import numpy as np
type(None)
NoneType
type(np.nan)
float
1. None
None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。
object类型的运算要比int类型的运算慢得多
计算不同数据类型求和时间
%timeit np.arange(1e5,dtype=xxx).sum()
1E7
10000000.0
%timeit np.arange(1E6, dtype= int).sum()
4.85 ms ± 1.08 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.arange(1E6, dtype = float).sum()
7.33 ms ± 587 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.arange(1E6,dtype = object).sum()
118 ms ± 8.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
2. np.nan(NaN)
np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
但可以使用np.nan*()函数来计算nan,此时视nan为0。
nd = np.array([10,20,30,np.nan,None])
#None 不能够参加到运算当中
nd.sum()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-218f693fc17f> in <module>()
1 nd = np.array([10,20,30,np.nan,None])
----> 2 nd.sum()
C:\anaconda\lib\site-packages\numpy\core\_methods.py in _sum(a, axis, dtype, out, keepdims)
30
31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32 return umr_sum(a, axis, dtype, out, keepdims)
33
34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):
TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'
nd = np.array([10,20,30,np.nan])
nd
array([10., 20., 30., nan])
nd.sum()
nan
np.mean(nd)
nan
np.nanmean(nd)
20.0
np.nansum(nd)
60.0
np.nan
nan
3. pandas中的None与NaN
1) pandas中None与np.nan都视作np.nan
创建DataFrame
import pandas as pd
from pandas import Series,DataFrame
df = DataFrame([10,20,57,None,np.nan], index = list('abcde'), columns = ["Python"])
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | |
|---|---|
| a | 10.0 |
| b | 20.0 |
| c | 57.0 |
| d | NaN |
| e | NaN |
df.sum()
Python 87.0
dtype: float64
df = DataFrame([[10,20,57,None,np.nan],
[22,33,56,16,None],
[np.nan,1,2,3,4]], index = list("abc"), columns = ["Python","Java","物理","数学","H5"])
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20 | 57 | NaN | NaN |
| b | 22.0 | 33 | 56 | 16.0 | NaN |
| c | NaN | 1 | 2 | 3.0 | 4.0 |
df.sum(axis = 0)
Python 32.0
Java 54.0
物理 115.0
数学 19.0
H5 4.0
dtype: float64
使用DataFrame行索引与列索引修改DataFrame数据
df["Python"]["c"] = 12
C:\anaconda\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
"""Entry point for launching an IPython kernel.
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20 | 57 | NaN | NaN |
| b | 22.0 | 33 | 56 | 16.0 | NaN |
| c | 12.0 | 1 | 2 | 3.0 | 4.0 |
2) pandas中None与np.nan的操作
df = DataFrame([[10,20,57,None,np.nan],
[22,33,56,16,None],
[np.nan,1,2,3,4]], index = list("abc"), columns = ["Python","Java","物理","数学","H5"])
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20 | 57 | NaN | NaN |
| b | 22.0 | 33 | 56 | 16.0 | NaN |
| c | NaN | 1 | 2 | 3.0 | 4.0 |
#下面讲的是一个重点!!!!
isnull()notnull()dropna(): 过滤丢失数据fillna(): 填充丢失数据
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20 | 57 | NaN | NaN |
| b | 22.0 | 33 | 56 | 16.0 | NaN |
| c | NaN | 1 | 2 | 3.0 | 4.0 |
#DataFrame 的isnull这个函数返回值就是一个DataFrame
is_null = df.isnull()
is_null
#
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | False | False | False | True | True |
| b | False | False | False | False | True |
| c | True | False | False | False | False |
#需求:查看哪一行有空值,举数据分析的例子的时候吗,会用这个方法
is_null = is_null.any(axis = 1)
is_null
a True
b True
c True
dtype: bool
df2 = DataFrame([[10,20,57,90,28],[22,35,46,78,67],[21,34,23,77,66]],
index = list("efg"),columns = ["Python","Java","物理","数学","H5"] )
#没空值的数据
df2
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| e | 10 | 20 | 57 | 90 | 28 |
| f | 22 | 35 | 46 | 78 | 67 |
| g | 21 | 34 | 23 | 77 | 66 |
df3 = df.add(df2, fill_value = 0)
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | NaN |
| b | 22.0 | 33.0 | 56.0 | 16.0 | NaN |
| c | NaN | 1.0 | 2.0 | 3.0 | 4.0 |
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
df3_isnull = df3.isnull()
df3_isnull = df3_isnull.any(axis = 1)
df3_isnull
a True
b True
c True
e False
f False
g False
dtype: bool
df3[df3_isnull]
#过滤问题 过滤的是没有空值的,留下来的是带空值的!!!
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | NaN |
| b | 22.0 | 33.0 | 56.0 | 16.0 | NaN |
| c | NaN | 1.0 | 2.0 | 3.0 | 4.0 |
df
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20 | 57 | NaN | NaN |
| b | 22.0 | 33 | 56 | 16.0 | NaN |
| c | NaN | 1 | 2 | 3.0 | 4.0 |
df[is_null]
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20 | 57 | NaN | NaN |
| b | 22.0 | 33 | 56 | 16.0 | NaN |
| c | NaN | 1 | 2 | 3.0 | 4.0 |
(1)判断函数
isnull()notnull()
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | NaN |
| b | 22.0 | 33.0 | 56.0 | 16.0 | NaN |
| c | NaN | 1.0 | 2.0 | 3.0 | 4.0 |
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
df3_notnull = df3.notnull().all(axis = 1)
df3_notnull
a False
b False
c False
e True
f True
g True
dtype: bool
df3[df3_notnull]
#过滤的是空值,留下来的是没有空值的情况
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
#还可以通过条件来进行过滤
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | NaN |
| b | 22.0 | 33.0 | 56.0 | 16.0 | NaN |
| c | NaN | 1.0 | 2.0 | 3.0 | 4.0 |
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
cond = (df3 >= 10).all(axis= 1)
cond
a False
b False
c False
e True
f True
g True
dtype: bool
df3[cond]
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
(2) 过滤函数
dropna()
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | NaN |
| b | 22.0 | 33.0 | 56.0 | 16.0 | NaN |
| c | NaN | 1.0 | 2.0 | 3.0 | 4.0 |
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
df3.dropna()
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| e | 10.0 | 20.0 | 57.0 | 90.0 | 28.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 67.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 66.0 |
df3["H5"] = None
df3
#pandas 自身的bug 但是数据还是nan
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | None |
| b | 22.0 | 33.0 | 56.0 | 16.0 | None |
| c | NaN | 1.0 | 2.0 | 3.0 | None |
| e | 10.0 | 20.0 | 57.0 | 90.0 | None |
| f | 22.0 | 35.0 | 46.0 | 78.0 | None |
| g | 21.0 | 34.0 | 23.0 | 77.0 | None |
df3.dropna(axis = 1,how = "all")
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | |
|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN |
| b | 22.0 | 33.0 | 56.0 | 16.0 |
| c | NaN | 1.0 | 2.0 | 3.0 |
| e | 10.0 | 20.0 | 57.0 | 90.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 |
可以选择过滤的是行还是列(默认为行)
也可以选择过滤的方式 how = 'all'
(3) 填充函数 Series/DataFrame
fillna()
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | None |
| b | 22.0 | 33.0 | 56.0 | 16.0 | None |
| c | NaN | 1.0 | 2.0 | 3.0 | None |
| e | 10.0 | 20.0 | 57.0 | 90.0 | None |
| f | 22.0 | 35.0 | 46.0 | 78.0 | None |
| g | 21.0 | 34.0 | 23.0 | 77.0 | None |
df3.fillna(-1)
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | -1.0 | -1 |
| b | 22.0 | 33.0 | 56.0 | 16.0 | -1 |
| c | -1.0 | 1.0 | 2.0 | 3.0 | -1 |
| e | 10.0 | 20.0 | 57.0 | 90.0 | -1 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | -1 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | -1 |
可以选择前向填充还是后向填充
df3
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | None |
| b | 22.0 | 33.0 | 56.0 | 16.0 | None |
| c | NaN | 1.0 | 2.0 | 3.0 | None |
| e | 10.0 | 20.0 | 57.0 | 90.0 | None |
| f | 22.0 | 35.0 | 46.0 | 78.0 | None |
| g | 21.0 | 34.0 | 23.0 | 77.0 | None |
df3.fillna(method = "bfill")
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | 16.0 | None |
| b | 22.0 | 33.0 | 56.0 | 16.0 | None |
| c | 10.0 | 1.0 | 2.0 | 3.0 | None |
| e | 10.0 | 20.0 | 57.0 | 90.0 | None |
| f | 22.0 | 35.0 | 46.0 | 78.0 | None |
| g | 21.0 | 34.0 | 23.0 | 77.0 | None |
df3.fillna(method = "ffill")
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | NaN | None |
| b | 22.0 | 33.0 | 56.0 | 16.0 | None |
| c | 22.0 | 1.0 | 2.0 | 3.0 | None |
| e | 10.0 | 20.0 | 57.0 | 90.0 | None |
| f | 22.0 | 35.0 | 46.0 | 78.0 | None |
| g | 21.0 | 34.0 | 23.0 | 77.0 | None |
#f forward 向前
df3.fillna(method='ffill', axis = 1)
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
| Python | Java | 物理 | 数学 | H5 | |
|---|---|---|---|---|---|
| a | 10.0 | 20.0 | 57.0 | 57.0 | 57.0 |
| b | 22.0 | 33.0 | 56.0 | 16.0 | 16.0 |
| c | NaN | 1.0 | 2.0 | 3.0 | 3.0 |
| e | 10.0 | 20.0 | 57.0 | 90.0 | 90.0 |
| f | 22.0 | 35.0 | 46.0 | 78.0 | 78.0 |
| g | 21.0 | 34.0 | 23.0 | 77.0 | 77.0 |
df3.fillna(method = "bfill",axis = 1)
对于DataFrame来说,还要选择填充的轴axis。记住,对于DataFrame来说:
- axis=0:index/行
- axis=1:columns/列
============================================
练习7:
简述None与NaN的区别
假设张三李四参加模拟考试,但张三因为突然想明白人生放弃了英语考试,因此记为None,请据此创建一个DataFrame,命名为ddd3
老师决定根据用数学的分数填充张三的英语成绩,如何实现?
用李四的英语成绩填充张三的英语成绩?
============================================
(二)pandas处理丢失数据的更多相关文章
- Pandas 处理丢失数据
处理丢失数据 import pandas as pd from pandas import Series, DataFrame import numpy as np 有两种丢失数据: 1. None ...
- pandas处理丢失数据-【老鱼学pandas】
假设我们的数据集中有缺失值,该如何进行处理呢? 丢弃缺失值的行或列 首先我们定义了数据集的缺失值: import pandas as pd import numpy as np dates = pd. ...
- Pandas处理丢失数据
1.创建含NaN的矩阵 >>> dates = pd.date_range(', periods=6) >>> df = pd.DataFrame(np.arang ...
- [数据清洗]- Pandas 清洗“脏”数据(二)
概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的.我们尝试去理解数据的列/行.记录.数据格式.语义错误.缺失的条目以及错误的 ...
- [数据清洗]- Pandas 清洗“脏”数据(三)
预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容.具体步骤: 导入 Pandas 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径) D ...
- Python利用pandas处理Excel数据的应用
Python利用pandas处理Excel数据的应用 最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...
- 【python基础】利用pandas处理Excel数据
参考:https://www.cnblogs.com/liulinghua90/p/9935642.html 一.安装第三方库xlrd和pandas 1:pandas依赖处理Excel的xlrd模块, ...
- Python3 Pandas的DataFrame数据的增、删、改、查
Python3 Pandas的DataFrame数据的增.删.改.查 一.DataFrame数据准备 增.删.改.查的方法有很多很多种,这里只展示出常用的几种. 参数inplace默认为False,只 ...
- pandas.DataFrame——pd数据框的简单认识、存csv文件
接着前天的豆瓣书单信息爬取,这一篇文章看一下利用pandas完成对数据的存储. 回想一下我们当时在最后得到了六个列表:img_urls, titles, ratings, authors, detai ...
随机推荐
- vue2.0+Element UI 实现动态表单(点击按钮增删一排输入框)
对于动态增减表单项,Element UI 官方文档表单那一节已经介绍得很清楚了,我之前没有看见,绕了很多弯路,这里针对点击按钮增删一排输入框的问题做一个总结. 效果图如下 存在一排必填的姓名与手机号, ...
- phpstorm里面无法配置deployment?
我的preference里面找不到deployment是什么回事啊? 解决方案: 导致这个问题的原因是PHPStorm的plugins里面没有Remote Hosts Access这个插件,安装一下这 ...
- PyQt5中QTableView函数讲解
如果想熟悉QTableWidget,请参考PyQt5高级界面控件之QTableWidget(四) setSpan(int, int, int, int)四个参数分别代表,起始行,列,合并的行数,全并的 ...
- LeetCode 78,面试常用小技巧,通过二进制获得所有子集
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第47篇文章,我们一起来看下LeetCode的第78题Subsets(子集). 这题的官方难度是Medium,点赞 ...
- docker安装mysql,设置mysql初始密码
docker安装mysql,只需要2分钟就可以完成 docker search mysql 拉取mysql镜像(https://hub.docker.com/_/mysql) docker pull ...
- javadoc导出成word文档
刚刚上次弄完了一个坑爹的任务,这次我领导又给我一个让人脑瓜子疼的任务了. 基本上客户他在验收我们系统的时候,都会要求我们编写相关的文档,这次也不例外. 只是这次的客户要求我们给出接口文档.不仅是要整个 ...
- ajax前后端交互原理(3)
3.HTTP服务器 3.3.相关前置知识 1 什么是url? 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的UR ...
- Asp.net Core依赖注入(Autofac替换IOC容器)
ASP.NET Core ASP.NET Core (previously ASP.NET 5) 改变了以前依赖注入框架集成进ASP.NET的方法. 以前, 每个功能 - MVC, Web API, ...
- 【博弈】HDU - 5963 朋友
题目 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双 ...
- Redis系列(八):发布与订阅
Redis的发布与订阅,有点类似于消息队列,发送者往频道发送消息,频道的订阅者接收消息. 1. 发布与订阅示例 首先,在本机开启第1个Redis客户端,执行如下命令订阅blog.redis频道: SU ...