pandas


1 作用:数据分析和处理

2 处理excel数据

2.1 读取excel数据
file = request.files.get("file")
read_ex = pd.read_excel(file)
df = pd.DataFrame(read_ex)

1.获取列标题:
columns = df.columns.values.tolist()

2.获取某一列数据:
area_list = df['大区'].tolist() # 获取列标题为“大区”的列数据

3.设置列:
df["user"] = "lxl" # 如果没有user列,会添加这一列,并填充“lxl”

4.对一行或一列做出一些操作(axis=1遍历行,axis=0遍历列)
df = df.apply(ra_data_process, axis=1)

5.重命名行或者列索引
df.rename(columns={
"门店编码": "store_code",
"商品编码": "sku_code",
"确认补货": "modify_replenish",
"调拨": "modify_send",
"建议调入门店": "receive_store_name",
"调入门店": "modify_receive_store_name",
},
inplace=True)

# inplace:bool,default False
将结果返回赋值给原变量,无需再次将结果赋值给新变量。即df.rename(inplace=True)之后,df的值发生改变(pandas中好多方法都有这个参数,此处就演示了)

6.获取部分列数据
df = df[["大区", "门店编码"]]

7.df转化为字典:
In [9]: df.to_dict(orient='records')
Out[9]:
[{'colA': 'A', 'colB': 'X', 'colC': 100, 'colD': 90},
{'colA': 'A', 'colB': nan, 'colC': 50, 'colD': 60},
{'colA': 'B', 'colB': 'Ya', 'colC': 30, 'colD': 60},
{'colA': 'C', 'colB': 'Xb', 'colC': 50, 'colD': 80},
{'colA': 'A', 'colB': 'Xa', 'colC': 20, 'colD': 50}]

8.DataFrame.loc:根据行列信息获取指定行列数据
cc1 = df.loc[1] # 1为行索引,这里获取第一行数据,从0行开始算,得到类似字典的东西,key为列索引
print(cc1['大区']) # 根据key获取这一行的值
values = cc1.values # 获取这一行数据的列表

cc1 = df.loc[[1, 2]] # 也可获取多行,这里表示获取索引为1和2两行的数据

cc1 = df.loc[[1, 2], '门店编码'] 如果中括号中有两个,第二个为列,这里表示,取第1、2行,列索引为‘门店编码’的列的数据

9. DataFrame.iloc 也是取行列数据,区别在于,取数据时,不是根据行列索引,而是根据行列数,计算时不包括行列索引
dd = df.iloc[1,1] # 取第1行第1列数据, 也是从0开始计数
dd = df.iloc[[1, 2], 1] #获取第1列,第1、2行的数据

10.获取dataframe获取行数、列数

a = [[1,2,3], [4,5,6], [7,8,9],[4,5,8]]
df = pandas.DataFrame(a)
print("行数", df.shape[0])  # 4
print("列数", df.shape[1])  # 3

 1.按某一列排序

    a = [(1, 2, 5), (3, 4, 5), (2, 3, 4)]
    df = pd.DataFrame(data=a, columns=["a", 'b', 'c'])
    print(df)
    df.sort_values(by="a", ascending=False, inplace=True) # by:按哪个字段排序, ascending:是否升序,inplace:是否修改当前dataframe
    print(df)

执行结果:

   a  b  c
0  1  2  5
1  3  4  5
2  2  3  4
   a  b  c
1  3  4  5
2  2  3  4
0  1  2  5

高级:排序时先对值进行转换,使用转换后的值进行排序

def to_pinyins(ss):     # 注意这里参数是一个列表
    '''
    转拼音
    :param s: 字符串或列表
    :type s: str or list
    :return: 拼音字符串
    '''
    return [''.join(chain.from_iterable(pinyin(s, style=Style.TONE3))) for s in ss]

if __name__ == '__main__':
    a = [("哈哈",4, 5), ("佳佳", 3, 4), ("啊啊", 2, 5), ("四十", 3, 4)]
    df = pd.DataFrame(data=a, columns=["a", 'b', 'c'])

    df.sort_values(by="a", inplace=True, key=to_pinyins)    # 传入一个方法,排序前会先用这个方法将列的值转换,使用转换后的值进行排序
    print(df)

执行结果 :

    a  b  c
2  啊啊  2  5
0  哈哈  4  5
1  佳佳  3  4
3  四十  3  4

2.去重:

    a = [(1, 2, 5), (1,2, 5), (2, 3, 4)]
    df = pd.DataFrame(data=a, columns=["a", 'b', 'c'])
    print(df)
    df.drop_duplicates(inplace=True)
    print(df)

执行结果:

   a  b  c
0  1  2  5
1  1  2  5
2  2  3  4
   a  b  c
0  1  2  5
2  2  3  4

3.获取某列的分类(去重后的值):

    a = [("哈哈",4, 5), ("佳佳", 3, 4), ("啊啊", 2, 5), ("四十", 3, 4)]
    df = pd.DataFrame(data=a, columns=["a", 'b', 'c'])    
    c = pd.Categorical(df['b'])
    print(c.categories)
    print("--------")
    print(c.tolist())
    print("--------")
    print(c.unique())
    print("--------")
    print(c.size)

执行结果:

Int64Index([2, 3, 4], dtype='int64')
--------
[4, 3, 2, 3]
--------
[4, 3, 2]
Categories (3, int64): [4, 3, 2]
--------
4

实现自定义排序

    a = [("哈哈",4, 5), ("佳佳", 3, 4), ("啊啊", 2, 5), ("四十", 3, 4)]
    df = pd.DataFrame(data=a, columns=["a", 'b', 'c'])
    cc = pd.Categorical(df['b'], categories=[3, 2, 4], ordered=True)    # 定义了b列分类为[3, 2, 4],并设置了顺序为 3>2>4
    print(cc)
    df["b"] = cc    # 将b列设置为cc,
    df.sort_values(by="b", inplace=True)    # 按b列排序,此时按照b列3>2>4进行排序  
    print(df)

执行结果:

[4, 3, 2, 3]
Categories (3, int64): [3 < 2 < 4]
    a  b  c
1  佳佳  3  4
3  四十  3  4
2  啊啊  2  5
0  哈哈  4  5

 

posted @ 2021-04-14 19:55  foreast  阅读(74)  评论(0编辑  收藏  举报