首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Pandas50个高级操作,必读!

Pandas50个高级操作,必读!

作者头像
数据派THU
发布于 2023-04-18 03:40:43
发布于 2023-04-18 03:40:43
1.6K00
代码可运行
举报
文章被收录于专栏:数据派THU数据派THU
运行总次数:0
代码可运行

来源:机器学习杂货店

本文约4000字,建议阅读10分钟

在Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。

数据分析数据建模的过程中需要对数据进行清洗和整理等工作,有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。

https://zhuanlan.zhihu.com/p/568250201

01、复杂查询

实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何发挥Pandas数据筛选的无限可能,随心所欲地取用数据。

1、逻辑运算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Q1成绩大于36df.Q1> 36# Q1成绩不小于60分,并且是C组成员~(df.Q1< 60) & (df['team'] == 'C')

2、逻辑筛选数据

切片([ ])、.loc[ ]和.iloc[ ]均支持上文所介绍的逻辑表达式。

以下是切片([ ])的逻辑筛选示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df[df['Q1']== 8] # Q1等于8df[~(df['Q1']== 8)] # 不等于8df[df.name== 'Ben'] # 姓名为Bendf[df.Q1> df.Q2]

以下是.loc[ ]和.lic[ ]示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 表达式与切片一致df.loc[df['Q1']> 90, 'Q1':] # Q1大于90,只显示Q1df.loc[(df.Q1> 80) & (df.Q2 < 15)] # and关系df.loc[(df.Q1> 90) | (df.Q2 < 90)] # or关系df.loc[df['Q1']== 8] # 等于8df.loc[df.Q1== 8] # 等于8df.loc[df['Q1']> 90, 'Q1':] # Q1大于90,显示Q1及其后所有列

3、函数筛选

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查询最大索引的值df.Q1[lambdas: max(s.index)] # 值为21# 计算最大值max(df.Q1.index)# 99df.Q1[df.index==99]

4、比较函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以下相当于 df[df.Q1 == 60]df[df.Q1.eq(60)]df.ne() # 不等于 !=df.le() # 小于等于 <=df.lt() # 小于 <df.ge() # 大于等于 >=df.gt() # 大于 >

5、查询df.query()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.query('Q1 > Q2 > 90') # 直接写类型SQL where语句

还支持使用@符引入变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 支持传入变量,如大于平均分40分的a = df.Q1.mean()df.query('Q1 > @a+40')df.query('Q1 > `Q2`+@a')
代码语言:javascript
代码运行次数:0
运行
复制

df.eval()与df.query()类似,也可以用于表达式筛选。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# df.eval()用法与df.query类似df[df.eval("Q1 > 90 > Q3 >10")]
df[df.eval("Q1 > `Q2`+@a")]
代码语言:javascript
代码运行次数:0
运行
复制

6、筛选df.filter()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.filter(items=['Q1', 'Q2']) # 选择两列df.filter(regex='Q', axis=1) # 列名包含Q的列df.filter(regex='e$', axis=1) # 以e结尾的列df.filter(regex='1$', axis=0) # 正则,索引名以1结尾df.filter(like='2', axis=0) # 索引中有2的# 索引中以2开头、列名有Q的
df.filter(regex='^2',axis=0).filter(like='Q', axis=1)
代码语言:javascript
代码运行次数:0
运行
复制

7、按数据类型查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'])
代码语言:javascript
代码运行次数:0
运行
复制

02、数据类型转换

在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对所有字段指定统一类型df = pd.DataFrame(data, dtype='float32')# 对每个字段分别指定df = pd.read_excel(data, dtype={'team':'string', 'Q1': 'int32'})

1、推断类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 自动转换合适的数据类型df.infer_objects() # 推断后的DataFramedf.infer_objects().dtypes
代码语言:javascript
代码运行次数:0
运行
复制

2、指定类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 按大体类型推定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()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.Q1.astype('int32').dtypes# dtype('int32')df.astype({'Q1': 'int32','Q2':'int32'}).dtypes

4、转为时间类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
t = pd.Series(['20200801', '20200802'])

03、数据排序

数据排序是指按一定的顺序将数据重新排列,帮助使用者发现数据的变化趋势,同时提供一定的业务线索,还具有对数据纠错、分类等作用。

1、索引排序df.sort_index()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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) # 会把列按列名顺序排列
代码语言:javascript
代码运行次数:0
运行
复制

2、数值排序sort_values()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.Q1.sort_values()df.sort_values('Q4')df.sort_values(by=['team', 'name'],ascending=[True, False])
代码语言:javascript
代码运行次数:0
运行
复制

其他方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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内再看Q1df.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、混合排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.set_index('name', inplace=True) # 设置name为索引df.index.names = ['s_name'] # 给索引起名df.sort_values(by=['s_name', 'team']) # 排序

4、按值大小排序nsmallest()和nlargest()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.nsmallest(3) # 最小的3个s.nlargest(3) # 最大的3个# 指定列df.nlargest(3, 'Q1')df.nlargest(5, ['Q1', 'Q2'])df.nsmallest(5, ['Q1', 'Q2'])
代码语言:javascript
代码运行次数:0
运行
复制

04、添加修改

数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误、格式转换,数据的类型修改等。

1、修改数值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.iloc[0,0] # 查询值# 'Liver'df.iloc[0,0] = 'Lily' # 修改值df.iloc[0,0] # 查看结果# 'Lily'
# 将小于60分的成绩修改为60df[df.Q1 < 60] = 60# 查看df.Q1
# 生成一个长度为100的列表v = [1, 3, 5, 7, 9] * 20

2、替换数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.replace(0, 5) # 将列数据中的0换为5df.replace(0, 5) # 将数据中的所有0换为5df.replace([0, 1, 2, 3], 4) # 将03全换成4df.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) # 将指定字段的指定值修改为100df.replace({'Q1': {0: 100, 4: 400}}) # 将指定列里的指定值替换为另一个指定的值
代码语言:javascript
代码运行次数:0
运行
复制

3、填充空值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.fillna(0) # 将空值全修改为0# {'backfill', 'bfill', 'pad', 'ffill',None}, 默认为Nonedf.fillna(method='ffill') # 将空值都修改为其前一个值values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}df.fillna(value=values) # 为各列填充不同的值df.fillna(value=values, limit=1) # 只替换第一个
代码语言:javascript
代码运行次数:0
运行
复制

4、修改索引名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.rename(columns={'team':'class'})

常用方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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修改为classdf.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、增加列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df['foo'] = 100 # 增加一列foo,所有值都是100df['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'] = '我是新来的' # 也可以# 增加一列并赋值,不满足条件的为NaNdf.loc[df.num >= 60, '成绩'] = '合格'df.loc[df.num < 60, '成绩'] = '不合格'

6、插入列df.insert()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在第三列的位置上插入新列total列,值为每行的总成绩df.insert(2, 'total', df.sum(1))

7、指定列df.assign()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 增加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) # 新增加一列Q5df = df.assign(Q5=[100]*100) # 赋值生效df.assign(Q6=df.Q2/df.Q1) # 计算并增加Q6df.assign(Q7=lambda d: d.Q1 * 9 / 5 + 32) # 使用lambda# 添加一列,值为表达式结果:True或Falsedf.assign(tag=df.Q1>df.Q2)# 比较计算,True为1,False为0df.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.Q8

8、执行表达式df.eval()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 传入求总分表达式df.eval('total = Q1+Q3+Q3+Q4')

其他方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、增加行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 新增索引为100的数据df.loc[100] = ['tom', 'A', 88, 88, 88, 88]

其他方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.loc[101]={'Q1':88,'Q2':99} # 指定列,无数据列值为NaNdf.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)] = row

10、追加合并

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.DataFrame([[1, 2], [3, 4]],columns=list('AB'))df2 = pd.DataFrame([[5, 6], [7, 8]],columns=list('AB'))
df.append(df2)
代码语言:javascript
代码运行次数:0
运行
复制

11、删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 删除索引为3的数据s.pop(3)# 93ss

12、删除空值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.dropna() # 一行中有一个缺失值就删除df.dropna(axis='columns') # 只保留全有值的列df.dropna(how='all') # 行或列全没值才删除df.dropna(thresh=2) # 至少有两个空值时才删除df.dropna(inplace=True) # 删除并使替换生效
代码语言:javascript
代码运行次数:0
运行
复制

05、高级过滤

介绍几个非常好用的复杂数据处理的数据过滤输出方法。

1、df.where()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 数值大于70df.where(df > 70)
代码语言:javascript
代码运行次数:0
运行
复制

2、np.where()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 小于60分为不及格np.where(df>=60, '合格', '不合格')
代码语言:javascript
代码运行次数:0
运行
复制

3、df.mask()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 符合条件的为NaNdf.mask(s > 80)
代码语言:javascript
代码运行次数:0
运行
复制

4、df.lookup()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 行列相同数量,返回一个arraydf.lookup([1,3,4], ['Q1','Q2','Q3']) # array([36, 96, 61])df.lookup([1], ['Q1']) # array([36])
代码语言:javascript
代码运行次数:0
运行
复制

06、数据迭代

1、迭代Series

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 迭代指定的列for i in df.name:      print(i)# 迭代索引和指定的两列for i,n,q in zip(df.index, df.name,df.Q1):print(i, n, q)
代码语言:javascript
代码运行次数:0
运行
复制

2、df.iterrows()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 迭代,使用name、Q1数据for index, row in df.iterrows():print(index, row['name'], row.Q1)
代码语言:javascript
代码运行次数:0
运行
复制

3、df.itertuples()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for row in df.itertuples():print(row)
代码语言:javascript
代码运行次数:0
运行
复制

4、df.items()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Series取前三个for label, ser in df.items():    print(label)print(ser[:3], end='\n\n')
代码语言:javascript
代码运行次数:0
运行
复制

5、按列迭代

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 直接对DataFrame迭代for column in df:print(column)

07、函数应用

1、pipe()

应用在整个DataFrame或Series上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对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)
)
代码语言:javascript
代码运行次数:0
运行
复制

2、apply()

应用在DataFrame的行或列中,默认为列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 将name全部变为小写df.name.apply(lambda x: x.lower())
代码语言:javascript
代码运行次数:0
运行
复制

3、applymap()

应用在DataFrame的每个元素中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 计算数据的长度def mylen(x):    return len(str(x))df.applymap(lambda x:mylen(x)) # 应用函数df.applymap(mylen) # 效果同上
代码语言:javascript
代码运行次数:0
运行
复制

4、map()

应用在Series或DataFrame的一列的每个元素中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.team.map({'A':'一班', 'B':'二班','C':'三班', 'D':'四班',})# 枚举替换df['name'].map(f)
代码语言:javascript
代码运行次数:0
运行
复制

5、agg()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 每列的最大值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()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.transform(lambda x: x*2) # 应用匿名函数df.transform([np.sqrt, np.exp]) # 调用多个函数
代码语言:javascript
代码运行次数:0
运行
复制

7、copy()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = pd.Series([1, 2], index=["a","b"])s_1 = ss_copy = s.copy()s_1 is s # Trues_copy is s # False

编辑:王菁

校对:王欣

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。
福大大架构师每日一题
2021/04/04
9240
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。
福大大架构师每日一题
2021/12/01
2450
2022-01-11:给定一个正数数组arr长度为n、正数x、正数y
2022-01-11:给定一个正数数组arr长度为n、正数x、正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.不变; 2.可以选择让num变成0,承担x的代价; 3.可以选择让num变成-num,承担y的代价。 返回你达到目标的最小代价。 数据规模 : 面试时面试官没有说数据规模。 来自微软面试。 答案2022-01-11: 贪心。从大到小排序。 x>=y时,就只执行y操作,没有x操作。 x<y时,先执行y操作,再执行
福大大架构师每日一题
2022/01/11
4280
2021-06-27:给定一个正数数组arr,代表若干人的体重
2021-06-27:给定一个正数数组arr,代表若干人的体重。再给定一个正数limit,表示所有船共同拥有的载重量。每艘船最多坐两人,且不能超过载重,想让所有的人同时过河,并且用最好的分配方法让船尽量少。返回最少的船数。
福大大架构师每日一题
2021/06/27
3600
2021-06-27:给定一个正数数组arr,代表若干人的体重
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福大大架构师每日一题
2021/02/25
3190
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。
福大大架构师每日一题
2021/02/15
4420
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
2022-04-02:你只有1*1、1*2、1*3、1*4,四种规格的砖块。 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆
3)区域内部(不算区域整体的4条边界),不能有任何砖块的边界线(从上一直贯穿到下)。
福大大架构师每日一题
2022/04/02
5110
2021-11-22:给定一个正数数组arr,表示每个小朋友的得
任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果;
福大大架构师每日一题
2021/11/22
2120
2021-04-05:给两个长度分别为M和N的整型数组...
2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。
福大大架构师每日一题
2021/04/05
4860
2021-04-05:给两个长度分别为M和N的整型数组...
2021-07-27:给定一个数组arr,长度为N,arr中的值只有1
2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arri == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arri == 2,代表汉诺塔问题中,从上往下第i个圆盘目前在中;arri == 3,代表汉诺塔问题中,从上往下第i个圆盘目前在右。那么arr整体就代表汉诺塔游戏过程中的一个状况。如果这个状况不是汉诺塔最优解运动过程中的状况,返回-1。如果这个状况是汉诺塔最优解运动过程中的状况,返回它是第几个状况。
福大大架构师每日一题
2021/07/27
1.2K0
2021-07-27:给定一个数组arr,长度为N,arr中的值只有1
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, a
中间位置i需要达标,达标的条件是 : arri-1 > arri 或者 arri+1 > arri哪个都可以。
福大大架构师每日一题
2022/01/12
3690
2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的
2021-10-26:给定一个数组arr,arri = j,表示第i号试题的难度为j。给定一个非负数M。想出一张卷子,对于任何相邻的两道题目,前一题的难度不能超过后一题的难度+M。返回所有可能的卷子种数。
福大大架构师每日一题
2021/10/26
3280
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 R。 获得分数为 L_X_R。 2)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边所有气球都已经被打爆。获得分数为 L_X。 3)如果被打爆气球的左边所有的气球都已经被打爆;如果被打爆气球的右边有没被打爆的 气球,找到离被打爆气球最近的气球,假设分数为 R;如果被打爆气球的右边所有气球都 已经 被打爆。获得分数为 X_R。 4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为 X。目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。【举例】arr = {3,2,5} 如果先打爆3,获得3_2;再打爆2,获得2_5;最后打爆5,获得5;最后总分21 如果先打爆3,获得3_2;再打爆5,获得2_5;最后打爆2,获得2;最后总分18 如果先打爆2,获得3_2_5;再打爆3,获得3_5;最后打爆5,获得5;最后总分50 如果先打爆2,获得3_2_5;再打爆5,获得3_5;最后打爆3,获得3;最后总分48 如果先打爆5,获得2_5;再打爆3,获得3_2;最后打爆2,获得2;最后总分18 如果先打爆5,获得2_5;再打爆2,获得3_2;最后打爆3,获得3;最后总分19 返回能获得的最大分数为50。
福大大架构师每日一题
2021/05/04
3380
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整个过程要求时间复杂度O(N)。
福大大架构师每日一题
2021/04/07
3540
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分
2022-03-18:arr数组长度为n, magic数组长度为m 比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值, 那么收益
比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值,
福大大架构师每日一题
2022/03/18
8900
2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中
5.调用函数mustOneScroll(arr, 0, n-1),返回一个整数,并赋值给变量p2。
福大大架构师每日一题
2023/09/01
2110
2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中
2021-04-25:给定一个数组arr,和一个正数M,返回在
福大大 答案2021-04-25: 前缀和+左大右小的双端队列。时间太晚了,所以写得简单。 代码用golang编写。代码如下: package main import ( "container/list" "fmt" ) func main() { arr := []int{1, 2, -3, 4, -5} ret := maxSum(arr, 5) fmt.Println(ret) } // O(N)的解法,最优解 func maxSum(arr []int,
福大大架构师每日一题
2021/05/04
3960
2021-04-25:给定一个数组arr,和一个正数M,返回在
2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k
2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。
福大大架构师每日一题
2021/06/23
9710
2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k
2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋
中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。
福大大架构师每日一题
2022/01/15
2850
2021-10-18:乘积最大子数组。给你一个整数数组 nums
2021-10-18:乘积最大子数组。给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。力扣152。
福大大架构师每日一题
2021/10/18
2700
推荐阅读
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
9240
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
2450
2022-01-11:给定一个正数数组arr长度为n、正数x、正数y
4280
2021-06-27:给定一个正数数组arr,代表若干人的体重
3600
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
3190
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
4420
2022-04-02:你只有1*1、1*2、1*3、1*4,四种规格的砖块。 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆
5110
2021-11-22:给定一个正数数组arr,表示每个小朋友的得
2120
2021-04-05:给两个长度分别为M和N的整型数组...
4860
2021-07-27:给定一个数组arr,长度为N,arr中的值只有1
1.2K0
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, a
3690
2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的
3280
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
3380
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分
3540
2022-03-18:arr数组长度为n, magic数组长度为m 比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值, 那么收益
8900
2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中
2110
2021-04-25:给定一个数组arr,和一个正数M,返回在
3960
2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k
9710
2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋
2850
2021-10-18:乘积最大子数组。给你一个整数数组 nums
2700
相关推荐
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
更多 >
LV.9
北京动视元科技有限公司研发工程师
目录
  • 01、复杂查询
    • 1、逻辑运算
    • 2、逻辑筛选数据
    • 3、函数筛选
    • 4、比较函数
    • 5、查询df.query()
    • 6、筛选df.filter()
  • 02、数据类型转换
    • 1、推断类型
    • 2、指定类型
    • 3、类型转换astype()
    • 4、转为时间类型
  • 03、数据排序
    • 1、索引排序df.sort_index()
    • 2、数值排序sort_values()
    • 3、混合排序
    • 4、按值大小排序nsmallest()和nlargest()
  • 04、添加修改
    • 1、修改数值
    • 2、替换数据
    • 3、填充空值
    • 4、修改索引名
    • 5、增加列
    • 6、插入列df.insert()
    • 7、指定列df.assign()
    • 8、执行表达式df.eval()
    • 9、增加行
    • 10、追加合并
    • 11、删除
    • 12、删除空值
  • 05、高级过滤
    • 1、df.where()
    • 2、np.where()
    • 3、df.mask()
    • 4、df.lookup()
  • 06、数据迭代
    • 1、迭代Series
    • 2、df.iterrows()
    • 3、df.itertuples()
    • 4、df.items()
    • 5、按列迭代
    • 07、函数应用
    • 1、pipe()
    • 2、apply()
    • 3、applymap()
    • 4、map()
    • 5、agg()
    • 6、transform()
    • 7、copy()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档