Numpy 与 Pandas 小技巧记录

目录

0、numpy pandas 常见的错误警告

1、Pandas .apply() 函数内部处理数据 进度条/计数器 怎么实现

2、Pandas 、Numpy 、iter 对象 两种 滑块代码

   (1)首尾相接的滑块

     (2)首部索引依次向下的滑块

3、Pandas reshape相关函数介绍(pivot,pivot_table,stack,unstack,melt、transpose)

      (1)pandas行列转置  .T、Transpose

      (2)索引转换

        (3) Dataframe 指定 索引位值 插入列数据 .insert()

4、Pandas 合并 merge,append,join,conca

5、DataFrame行列不固定怎么用 .loc 做切片

6、array[0:405,0:405,...] 的索引

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

                  Pandas.DataFrame行和列的转置 .T

      (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 的方法,仅仅创建一个新表赋值即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值