Pandas50个高级操作,点评+扩充! pandas period
liuian 2024-12-20 17:18 100 浏览
数据分析和数据建模的过程中需要对数据进行清洗和整理等工作,有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。
本文引自书籍《深入浅出Pandas》,作者是李庆辉老师,李老师是知名数据产品专家,在某电商公司数据产品团队担任负责人,擅长通过数据治理、数据分析、数据化运营提升公司的数据应用水平。
《深入浅出Pandas》这本书既是初学者系统学习Pandas难得的入门书,又是有经验的Python工程师案头必不可少的查询手册,推荐大家阅读!
引自:《深入浅出Pandas:利用Python进行数据处理与分析》
作者:李庆辉
civilpy:Python数据分析及可视化实例目录
01、复杂查询
实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何发挥Pandas数据筛选的无限可能,随心所欲地取用数据。
1、逻辑运算
★★★☆☆
# Q1成绩大于36
df.Q1> 36
# Q1成绩不小于60分,并且是C组成员
~(df.Q1< 60) & (df['team'] == 'C')2、逻辑筛选数据
★★★★★
切片([ ])、.loc[ ]和.iloc[ ]均支持上文所介绍的逻辑表达式。
以下是切片([ ])的逻辑筛选示例:
df[df['Q1']== 8] # Q1等于8
df[~(df['Q1']== 8)] # 不等于8
df[df.name== 'Ben'] # 姓名为Ben
df[df.Q1> df.Q2]以下是.loc[ ]和.lic[ ]示例:
# 表达式与切片一致
df.loc[df['Q1']> 90, 'Q1':] # Q1大于90,只显示Q1
df.loc[(df.Q1> 80) & (df.Q2 < 15)] # and关系
df.loc[(df.Q1> 90) | (df.Q2 < 90)] # or关系
df.loc[df['Q1']== 8] # 等于8
df.loc[df.Q1== 8] # 等于8
df.loc[df['Q1']> 90, 'Q1':] # Q1大于90,显示Q1及其后所有列3、函数筛选
★☆☆☆☆
# 查询最大索引的值
df.Q1[lambdas: max(s.index)] # 值为21
# 计算最大值
max(df.Q1.index)
# 99
df.Q1[df.index==99]4、比较函数
★★★☆☆
# 以下相当于 df[df.Q1 == 60]
df[df.Q1.eq(60)]
df.ne() # 不等于 !=
df.le() # 小于等于 <=
df.lt() # 小于 <
df.ge() # 大于等于 >=
df.gt() # 大于 >5、查询df.query()
★★★☆☆
df.query('Q1 > Q2 > 90') # 直接写类型SQL where语句还支持使用@符引入变量
# 支持传入变量,如大于平均分40分的
a = df.Q1.mean()
df.query('Q1 > @a+40')
df.query('Q1 > `Q2`+@a')df.eval()与df.query()类似,也可以用于表达式筛选。
# df.eval()用法与df.query类似
df[df.eval("Q1 > 90 > Q3 >10")]
df[df.eval("Q1 > `Q2`+@a")]6、筛选df.filter()
★★☆☆☆
df.filter(items=['Q1', 'Q2']) # 选择两列
df.filter(regex='Q', axis=1) # 列名包含Q的列
df.filter(regex='e#39;, axis=1) # 以e结尾的列
df.filter(regex='1#39;, axis=0) # 正则,索引名以1结尾
df.filter(like='2', axis=0) # 索引中有2的
# 索引中以2开头、列名有Q的
df.filter(regex='^2',axis=0).filter(like='Q', axis=1)7、按数据类型查询
★★★☆☆
df.select_dtypes(include=['float64']) # 选择float64型数据
df.select_dtypes(include='bool')
df.select_dtypes(include=['number']) # 只取数字型
df.select_dtypes(exclude=['int']) # 排除int类型
df.select_dtypes(exclude=['datetime64'])02、数据类型转换
在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。
# 对所有字段指定统一类型
df = pd.DataFrame(data, dtype='float32')
# 对每个字段分别指定
df = pd.read_excel(data, dtype={'team':'string', 'Q1': 'int32'})1、推断类型
★★★☆☆
# 自动转换合适的数据类型
df.infer_objects() # 推断后的DataFrame
df.infer_objects().dtypes2、指定类型
★★☆☆☆
# 按大体类型推定
m = ['1', 2, 3]
s = pd.to_numeric(s) # 转成数字
pd.to_datetime(m) # 转成时间
pd.to_timedelta(m) # 转成时间差
pd.to_datetime(m, errors='coerce') # 错误处理
pd.to_numeric(m, errors='ignore')
pd.to_numeric(m errors='coerce').fillna(0) # 兜底填充
pd.to_datetime(df[['year', 'month', 'day']])
# 组合成日期3、类型转换astype()
★★★☆☆
df.Q1.astype('int32').dtypes
# dtype('int32')
df.astype({'Q1': 'int32','Q2':'int32'}).dtypes4、转为时间类型
★★★★★
# 创建一个DataFrame对象
df = pd.DataFrame({'date': ['2022-02-01', '2022-02-02', '2022-02-03'],
'value': [10, 20, 30]})
# 将'date'列转换为日期时间类型
df['date'] = pd.to_datetime(df['date'])03、数据排序
数据排序是指按一定的顺序将数据重新排列,帮助使用者发现数据的变化趋势,同时提供一定的业务线索,还具有对数据纠错、分类等作用。
1、索引排序df.sort_index()
★★★★☆
s.sort_index() # 升序排列
df.sort_index() # df也是按索引进行排序
df.team.sort_index()s.sort_index(ascending=False)# 降序排列
s.sort_index(inplace=True) # 排序后生效,改变原数据
# 索引重新0-(n-1)排,很有用,可以得到它的排序号
s.sort_index(ignore_index=True)
s.sort_index(na_position='first') # 空值在前,另'last'表示空值在后
s.sort_index(level=1) # 如果多层,排一级
s.sort_index(level=1, sort_remaining=False) #这层不排
# 行索引排序,表头排序
df.sort_index(axis=1) # 会把列按列名顺序排列2、数值排序sort_values()
★★★★★
df.Q1.sort_values()
df.sort_values('Q4')
df.sort_values(by=['team', 'name'],ascending=[True, False])其他方法:
s.sort_values(ascending=False) # 降序
s.sort_values(inplace=True) # 修改生效
s.sort_values(na_position='first') # 空值在前
# df按指定字段排列
df.sort_values(by=['team'])
df.sort_values('Q1')
# 按多个字段,先排team,在同team内再看Q1
df.sort_values(by=['team', 'Q1'])
# 全降序
df.sort_values(by=['team', 'Q1'], ascending=False)
# 对应指定team升Q1降
df.sort_values(by=['team', 'Q1'],ascending=[True, False])
# 索引重新0-(n-1)排
df.sort_values('team', ignore_index=True)3、混合排序
★★☆☆☆
df.set_index('name', inplace=True) # 设置name为索引
df.index.names = ['s_name'] # 给索引起名
df.sort_values(by=['s_name', 'team']) # 排序4、按值大小排序nsmallest()和nlargest()
★★★★☆
s.nsmallest(3) # 最小的3个
s.nlargest(3) # 最大的3个
# 指定列
df.nlargest(3, 'Q1')
df.nlargest(5, ['Q1', 'Q2'])
df.nsmallest(5, ['Q1', 'Q2'])04、添加修改
数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误、格式转换,数据的类型修改等。
1、修改数值
★★★☆☆
df.iloc[0,0] # 查询值
# 'Liver'
df.iloc[0,0] = 'Lily' # 修改值
df.iloc[0,0] # 查看结果
# 'Lily'
# 将小于60分的成绩修改为60
df[df.Q1 < 60] = 60
# 查看
df.Q1
# 生成一个长度为100的列表
v = [1, 3, 5, 7, 9] * 202、替换数据
★★★☆☆
s.replace(0, 5) # 将列数据中的0换为5
df.replace(0, 5) # 将数据中的所有0换为5
df.replace([0, 1, 2, 3], 4) # 将0~3全换成4
df.replace([0, 1, 2, 3], [4, 3, 2, 1]) # 对应修改
s.replace([1, 2], method='bfill') # 向下填充
df.replace({0: 10, 1: 100}) # 字典对应修改
df.replace({'Q1': 0, 'Q2': 5}, 100) # 将指定字段的指定值修改为100
df.replace({'Q1': {0: 100, 4: 400}}) # 将指定列里的指定值替换为另一个指定的值3、填充空值
★★★★☆
df.fillna(0) # 将空值全修改为0
# {'backfill', 'bfill', 'pad', 'ffill',None}, 默认为None
df.fillna(method='ffill') # 将空值都修改为其前一个值
values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
df.fillna(value=values) # 为各列填充不同的值
df.fillna(value=values, limit=1) # 只替换第一个4、修改索引名
★★★☆☆
df.rename(columns={'team':'class'})常用方法如下:
df.rename(columns={"Q1":"a", "Q2": "b"}) # 对表头进行修改
df.rename(index={0: "x", 1:"y", 2: "z"}) # 对索引进行修改
df.rename(index=str) # 对类型进行修改
df.rename(str.lower, axis='columns') # 传索引类型
df.rename({1: 2, 2: 4}, axis='index')
# 对索引名进行修改
s.rename_axis("animal")
df.rename_axis("animal") # 默认是列索引
df.rename_axis("limbs",axis="columns") # 指定行索引
# 索引为多层索引时可以将type修改为class
df.rename_axis(index={'type': 'class'})
# 可以用set_axis进行设置修改
s.set_axis(['a', 'b', 'c'], axis=0)
df.set_axis(['I', 'II'], axis='columns')
df.set_axis(['i', 'ii'], axis='columns',inplace=True)5、增加列
★★☆☆☆
df['foo'] = 100 # 增加一列foo,所有值都是100
df['foo'] = df.Q1 + df.Q2 # 新列为两列相加
df['foo'] = df['Q1'] + df['Q2'] # 同上
# 把所有为数字的值加起来
df['total'] =df.select_dtypes(include=['int']).sum(1)df['total'] =
df.loc[:,'Q1':'Q4'].apply(lambda x: sum(x), axis='columns')
df.loc[:, 'Q10'] = '我是新来的' # 也可以
# 增加一列并赋值,不满足条件的为NaN
df.loc[df.num >= 60, '成绩'] = '合格'
df.loc[df.num < 60, '成绩'] = '不合格'6、插入列df.insert()
★★☆☆☆
# 在第三列的位置上插入新列total列,值为每行的总成绩
df.insert(2, 'total', df.sum(1))7、指定列df.assign()
★★☆☆☆
# 增加total列
df.assign(total=df.sum(1))
# 增加两列
df.assign(total=df.sum(1), Q=100)
df.assign(total=df.sum(1)).assign(Q=100)
其他使用示例:
df.assign(Q5=[100]*100) # 新增加一列Q5
df = df.assign(Q5=[100]*100) # 赋值生效
df.assign(Q6=df.Q2/df.Q1) # 计算并增加Q6
df.assign(Q7=lambda d: d.Q1 * 9 / 5 + 32) # 使用lambda# 添加一列,值为表达式结果:True或False
df.assign(tag=df.Q1>df.Q2)
# 比较计算,True为1,False为0
df.assign(tag=(df.Q1>df.Q2).astype(int))
# 映射文案
df.assign(tag=(df.Q1>60).map({True:'及格',False:'不及格'}))
# 增加多个
df.assign(Q8=lambda d: d.Q1*5,
Q9=lambda d: d.Q8+1) # Q8没有生效,不能直接用df.Q88、执行表达式df.eval()
★★☆☆☆
# 传入求总分表达式
df.eval('total = Q1+Q3+Q3+Q4')其他方法:
df['C1'] = df.eval('Q2 + Q3')
df.eval('C2 = Q2 + Q3') # 计算
a = df.Q1.mean()df.eval("C3 =`Q3`+@a") # 使用变量
df.eval("C3 = Q2 > (`Q3`+@a)") #加一个布尔值
df.eval('C4 = name + team', inplace=True) # 立即生效9、增加行
★★☆☆☆
# 新增索引为100的数据
df.loc[100] = ['tom', 'A', 88, 88, 88, 88]其他方法:
df.loc[101]={'Q1':88,'Q2':99} # 指定列,无数据列值为NaN
df.loc[df.shape[0]+1] = {'Q1':88,'Q2':99} # 自动增加索引
df.loc[len(df)+1] = {'Q1':88,'Q2':99}
# 批量操作,可以使用迭代
rows = [[1,2],[3,4],[5,6]]
for row in rows:
df.loc[len(df)] = row10、追加合并
★★★★☆
df = pd.DataFrame([[1, 2], [3, 4]],columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]],columns=list('AB'))
df.append(df2)11、删除
★☆☆☆☆
# 删除索引为3的数据
s.pop(3)
# 93s
s12、删除空值
★★☆☆☆
df.dropna() # 一行中有一个缺失值就删除
df.dropna(axis='columns') # 只保留全有值的列
df.dropna(how='all') # 行或列全没值才删除
df.dropna(thresh=2) # 至少有两个空值时才删除
df.dropna(inplace=True) # 删除并使替换生效05、高级过滤
介绍几个非常好用的复杂数据处理的数据过滤输出方法。
1、df.where()
★★☆☆☆
# 数值大于70
df.where(df > 70)2、np.where()
★★☆☆☆
# 小于60分为不及格
np.where(df>=60, '合格', '不合格')3、df.mask()
★★☆☆☆
# 符合条件的为NaN
df.mask(s > 80)4、df.lookup()
★★☆☆☆
# 行列相同数量,返回一个array
df.lookup([1,3,4], ['Q1','Q2','Q3']) # array([36, 96, 61])
df.lookup([1], ['Q1']) # array([36])06、数据迭代
1、迭代Series
★★☆☆☆
# 迭代指定的列
for i in df.name:
print(i)
# 迭代索引和指定的两列
for i,n,q in zip(df.index, df.name,df.Q1):
print(i, n, q)2、df.iterrows()
★★★☆☆
# 迭代,使用name、Q1数据
for index, row in df.iterrows():
print(index, row['name'], row.Q1)3、df.itertuples()
★★★☆☆
for row in df.itertuples():
print(row)4、df.items()
★☆☆☆☆
# Series取前三个
for label, ser in df.items():
print(label)
print(ser[:3], end='\n\n')5、按列迭代
★★☆☆☆
# 直接对DataFrame迭代
for column in df:
print(column)07、函数应用
1、pipe()
★☆☆☆☆
应用在整个DataFrame或Series上。
# 对df多重应用多个函数
f(g(h(df), arg1=a), arg2=b, arg3=c)
# 用pipe可以把它们连接起来
(df.pipe(h)
.pipe(g, arg1=a)
.pipe(f, arg2=b, arg3=c)
)2、apply()
★★★★★
应用在DataFrame的行或列中,默认为列。
# 将name全部变为小写
df.name.apply(lambda x: x.lower())3、applymap()
★☆☆☆☆
应用在DataFrame的每个元素中。
# 计算数据的长度
def mylen(x):
return len(str(x))
df.applymap(lambda x:mylen(x)) # 应用函数
df.applymap(mylen) # 效果同上4、map()
★★☆☆☆
应用在Series或DataFrame的一列的每个元素中。
df.team.map({'A':'一班', 'B':'二班','C':'三班', 'D':'四班',})# 枚举替换
df['name'].map(f)5、agg()
★★★★★
# 每列的最大值
df.agg('max')
# 将所有列聚合产生sum和min两行
df.agg(['sum', 'min'])
# 序列多个聚合
df.agg({'Q1' : ['sum', 'min'], 'Q2' : ['min','max']})
# 分组后聚合
df.groupby('team').agg('max')
df.Q1.agg(['sum', 'mean'])6、transform()
★★☆☆☆
df.transform(lambda x: x*2) # 应用匿名函数
df.transform([np.sqrt, np.exp]) # 调用多个函数7、copy()
★★☆☆☆
s = pd.Series([1, 2], index=["a","b"])
s_1 = s
s_copy = s.copy()
s_1 is s # True
s_copy is s # False08、扩充
1、isin()
★★★☆☆
使用isin()方法检查某个列是否包含指定的值:
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'name': ['alice', 'bob', 'charles'],
'age': [25, 30, 35]})
# 检查'name'列是否包含'alice'和'bob'
mask = df['name'].isin(['alice', 'bob'])
# 用布尔掩码筛选出满足条件的行
filtered_df = df[mask]
# 查看筛选后的结果
print(filtered_df)输出结果如下:
name age
0 alice 25
1 bob 30在这个示例中,我们首先创建了一个DataFrame对象,其中包含一个名为'name'的字符串列和一个名为'age'的整数列。然后,我们使用isin()方法检查'name'列中是否包含'alice'和'bob'两个值,并将结果存储在一个布尔掩码中。最后,我们使用该掩码筛选出满足条件的行,并将结果存储在filtered_df中。
2、contains()
★★★☆☆
使用contains()方法检查某个列中的元素是否包含指定的字符串:
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'name': ['alice', 'bob', 'charles'],
'age': [25, 30, 35]})
# 检查'name'列中的元素是否包含'li'
mask = df['name'].str.contains('li')
# 用布尔掩码筛选出满足条件的行
filtered_df = df[mask]
# 查看筛选后的结果
print(filtered_df)输出结果如下:
name age
0 alice 25在这个示例中,我们首先创建了一个DataFrame对象,其中包含一个名为'name'的字符串列和一个名为'age'的整数列。然后,我们使用contains()方法检查'name'列中的元素是否包含'li'字符串,并将结果存储在一个布尔掩码中。最后,我们使用该掩码筛选出满足条件的行,并将结果存储在filtered_df中。
3、df保存到mongodb
import pandas as pd
from pymongo import MongoClient
# 创建一个DataFrame对象
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35]})
# 创建一个MongoDB客户端
client = MongoClient('localhost', 27017)
# 选择一个数据库和集合
db = client['test_db']
collection = db['test_collection']
# 将DataFrame对象转换为字典
data_dict = df.to_dict(orient='records')
# 将数据插入到MongoDB中
collection.insert_many(data_dict)4、读取mongodb数据保存为df
import pandas as pd
from pymongo import MongoClient
# 创建一个MongoDB客户端
client = MongoClient('localhost', 27017)
# 选择一个数据库和集合
db = client['test_db']
collection = db['test_collection']
# 从MongoDB中读取数据
data = collection.find()
# 将数据转换为DataFrame对象
df = pd.DataFrame(list(data))
# 仅保留'name'和'age'列,并将结果存储回df
df = df[['name', 'age']]why?mongodb?MongoDB中的集合不需要预定义模式,因此可以将任何结构的数据插入到集合中。
只要你数据不是很大,或者服务器足够牛叉,mongoDB是数据分析师最佳选择方案,好吧,之一。
civilpy:Python数据分析及可视化实例之Pandas函数速查表
civilpy:Python数据分析及可视化实例之Pandas十分钟入门
civilpy:Pandas Dataframe操作concat、join、merge
civilpy:Pandas crosstab()与pivot_table()和groupby()的比较
civilpy:使用pandas进行数据分箱
相关推荐
-
- 驱动网卡(怎么从新驱动网卡)
-
网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...
-
2026-01-30 00:37 liuian
- win10更新助手装系统(微软win10更新助手)
-
1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...
- windows11专业版密钥最新(windows11专业版激活码永久)
-
Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...
-
- 手机删过的软件恢复(手机删除过的软件怎么恢复)
-
操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...
-
2026-01-29 23:55 liuian
- 一键ghost手动备份系统步骤(一键ghost 备份)
-
步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。 步骤...
- 怎么创建局域网(怎么创建局域网打游戏)
-
1、购买路由器一台。进入路由器把dhcp功能打开 2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。 3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...
- 精灵驱动器官方下载(精灵驱动手机版下载)
-
是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...
- 一键还原系统步骤(一键还原系统有哪些)
-
1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。 2、在弹出的“准备安装”窗口中,可...
- 电脑加速器哪个好(电脑加速器哪款好)
-
我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...
- 任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)
-
是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...
- u盘怎么恢复文件(u盘文件恢复的方法)
-
开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...
- 系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)
-
1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...
-
- 剪贴板权限设置方法(剪贴板访问权限)
-
1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...
-
2026-01-29 21:37 liuian
- 平板系统重装大师(平板重装win系统)
-
如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...
- 联想官网售后服务网点(联想官网售后服务热线)
-
联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
