目录
1、Pandas .apply() 函数内部处理数据 进度条/计数器 怎么实现
2、Pandas 、Numpy 、iter 对象 两种 滑块代码
3、Pandas reshape相关函数介绍(pivot,pivot_table,stack,unstack,melt、transpose)
(3) Dataframe 指定 索引位值 插入列数据 .insert()
4、Pandas 合并 merge,append,join,conca
7、Pandas 中透析表函数 pivot_table 生成固定顺序的报表 & datafram行列重新排序
0、numpy pandas 常见的错误警告
1、Pandas .apply() 函数内部处理数据 进度条/计数器 怎么实现
# 使用 tqbm 与 progress_apply
from tqdm import tqdm
import pandas as pd
tqdm.pandas(desc='pandas bar')
df = pd.DataFrame({1:[1], 2:[2], 3:[3]})
foo = df.progress_apply(lambda x: x+1)
2、Pandas 、Numpy 、iter 对象 两种 滑块代码
(1)首尾相接的滑块
例如: dataframe shape=(100,3)
希望循环执行如下:
第一次:取 0-9行的数据(即前十行,滑块的宽度为 10)
第二次:取 10-19行的数据
第三次:取 20-29行的数据
....
易错点:
最后一个滑块索引可能会溢出
由于不知道何时会停,使用while循环,当然也可以用 for 训循环
raws_num, cols_num = one_type_df.shape # one_type_df 是迭代对象,本题是dataframe
start = 0 # 定义开始索引
sleep_steep = 10 # 定义滑块的步长
while start < raws_num:
end = start + sleep_step
if end > raws_num:
end = raws_num
print(one_type_df.iloc[start:end,:]) # 滑块部分需要执行的代码,可以定义多个函数执行
time.sleep(1)
start = end
(2)首部索引依次向下的滑块
例如: dataframe shape=(100,3)
希望循环执行如下:
第一次:取 0-9行的数据(即前十行,滑块的宽度为 10)
第二次:取 1-10行的数据
第三次:取 2-11行的数据
....
易错点:
当取至 90-99行数据时,下一次或多次的索引,应当是:91-99 92-99 93-99 94-99 ...
raws_num,cols_num = dataframe.shape
neighbor = 10
# 定义 df 不断变换的总行数,如果每次取值都会删除dataframe的某些行,导致dataframe高度一直在变化,该参数有用
dy_raws_num = raws_num
for idx in range(raws_num):
start = idx
end = start + neighbor
if end > dy_raws_num:
end = dy_raws_num
if start >= dy_raws_num:
break
function( ..... ) # 这里定义一个或者多个滑块内部的代码
# 根据 上面返回的索引 删除行数据
dataframe.drop(index = [ , , , ])
vector_df.drop(index = [ , , , ])
# 更新当前 df 的行数
dy_raws_num,_ = dataframe.shape
3、Pandas reshape相关函数介绍(pivot,pivot_table,stack,unstack,melt、transpose)
(1)pandas行列转置 .T、Transpose
pandas DataFrame行列转置 stack,unstack
(2)索引转换
Pandas reshape相关函数介绍(pivot,pivot_table,stack,unstack,melt)
数据行列转置,数据透视(stack,unstack,pviot,pviot_table)
(3) Dataframe 指定 索引位值 插入列数据 .insert()
Dataframe.insert(loc, column, value, allow_duplicates=False): 在Dataframe的指定列中插入数据。
参数介绍:
loc: int型,表示第几列;若在第一列插入数据,则 loc=0
column: 给插入的列取名,如 column='新的一列'
value:数字,array,series等都可(可自己尝试)
allow_duplicates: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复。
4、Pandas 合并 merge,append,join,conca
python 把几个DataFrame合并成一个DataFrame——merge,append,join,conca
5、DataFrame行列不固定怎么用 .loc 做切片
1 .loc 指的是dataframe '字符串'的索引,可以直接使用切片
df.loc["a":"b","A":"C"]
2 但如果行与列的索引名不固定且一直在变化怎么取值
① 使用 .iloc 利用下标来取
② 如果用 .loc 方法 , 可以使用 df.index / df.columns 来获取index/columns的对象,对这些对象进行下标索引,然后用
于 .loc中
index = df.index
columns = df.colums
df.loc[index[1:-1],columns[4:-1]]
6、array[0:405,0:405,...] 的索引
1、当数组的 ndim 比较高或者ndim 不确定时,我们使用切片可以使用 ... 来代替其他维度所有内容
eg:array[0:405,0:405,...] ---- 切片取出 前405行,前405列其他维度所有的数据
7、Pandas 中透析表函数 pivot_table 生成固定顺序的报表 & datafram行列重新排序
需求描述:
利用 pd.pivot_table 函数输出数据透析表生成一个固定格式的报表。
难点:
在一个固定格式的报表中 填入 pd.pivot_table 生成的数据,空值的数据用0代替。
方法:
创建一个固定格式顺序的新表,使用赋值操作即可
df1 为报表格式,df2为pd.pivot_table 透视表
1、当 df1 完全包含 df2 的列行时
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((5,4),dtype=np.int32),index=list("abcde"),columns=list('ABCD')) # 因为空值用0来替代,所以用全 0 生成df1
print(df1)
out:
A B C D
a 0 0 0 0
b 0 0 0 0
c 0 0 0 0
d 0 0 0 0
e 0 0 0 0
df2 = pd.DataFrame(np.arange(100,108).reshape(4,2),index=list("cbde"),columns=list('CB'))
print(df2)
out:
C B
c 100 101
b 102 103
d 104 105
e 106 107
>>>>> 情况1:用小表df2 的索引 填写
df1.loc[df2.index,df2.columns] = df2 # 利用 df2.index,df2.columns 将 小表df2全部一一对应写入df1中
print(df1)
out:
A B C D
a 0 0 0 0
b 0 103 102 0
c 0 101 100 0
d 0 105 104 0
e 0 107 106 0
>>>>> 情况2:用大表df1 的索引 填写
df1.loc[df1.index,df1.columns] = df2 # 利用 df1.index,df1.columns 到小表 df2中寻址,寻不到用 NaN 代替
print(df1)
out:
A B C D
a NaN NaN NaN NaN
b NaN 103.0 102.0 NaN
c NaN 101.0 100.0 NaN
d NaN 105.0 104.0 NaN
e NaN 107.0 106.0 NaN
df1 为报表格式,df2为pd.pivot_table 透视表
2、当 df1 不完全包含 df2
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((5,4),dtype=np.int32),index=list("abcde"),columns=list('ABCD')) # 因为空值用0来替代,所以用全 0 生成df1
print(df1)
out:
A B C D
a 0 0 0 0
b 0 0 0 0
c 0 0 0 0
d 0 0 0 0
e 0 0 0 0
df2 = pd.DataFrame(np.arange(100,108).reshape(4,2),index=list("cbdf"),columns=list('CB'))
print(df2) # 此时 df2 中 f 行在 df1 表中是不需要的
out:
C B
c 100 101
b 102 103
d 104 105
f 106 107
>>>>> 情况1:用小表df2 的索引 填写
df1.loc[df2.index,df2.columns] = df2
print(df1) # 报错,因为 f 行索引在 df1 中不存在,所以这种情况需要用df1的索引来取 ; KeyError: "['f'] not in index"
>>>>> 情况2:用大表df1 的索引 填写
df1.loc[df1.index,df1.columns] = df2 # 利用 df1.index,df1.columns 到表 df2中寻址,寻不到用 NaN 代替
print(df1)
out:
A B C D
a NaN NaN NaN NaN
b NaN 103.0 102.0 NaN
c NaN 101.0 100.0 NaN
d NaN 105.0 104.0 NaN
e NaN NaN NaN NaN
tip:此时 df2 中 f行的数据会被舍弃,接下来将 NaN的值填充为 0 即可
收获:
对于一个行列顺序不固定 dataframe 生成一个固定行列顺序大小 dataframe 的方法,仅仅创建一个新表赋值即可