python数组处理大全

273 阅读10分钟

常用

数据预处理

axis=1是列

# 统计某一列当中的种类数量
data_namecount=data_new2['小区名字'].value_counts()

image.png

分组之后命名列

# 统计某一列当中的种类,并计算某一列平均值
data=data_new2.groupby('小区名字')['单价'].mean().astype(int).reset_index(name='平均单价')

原数据:

image.png 处理后的数据:

image.png

# 按key1进行分组,求每个分组的平均值
dfk=df.groupby('key1').mean()
dfk

image.png

# 为统计后的数据添加列名
# 将series转化为dataframe
data_namecount=data_namecount.reset_index()
data_namecount.columns = ["区域",'数量']

原数据:

image.png

改变后数据:

image.png

统计某一列数据当中有哪些值/统计某一列当中唯一的数值

value_counts = data_new2['户型'].value_counts()

绘图

绘制热力图

# 数据列中数据有重复的,使用pviot_table绘制,没有使用pviot绘制
flights = data_new2.pivot_table(index='楼层',columns='朝向',values='单价')
sns.heatmap(flights)
plt.yticks(rotation=0)

x坐标垂直,避免重叠

plt.xticks(rotation=90)

数据处理

NumPy

# 对角线为1的数组建立
np.eyes([3,3])

# 建立间隔为5的数组,返回的数组不是列表
np.arange(1205)

#给出区间,最后一个为个数,dtype为数值类型
np.linspace(1,20,5)

# 数组维度的个数,输出结果2,表示二维数组
data.ndim

# 数组的维度,输出结果(3,4),表示3行4列
data.shape

# 数组元素的个数,输出结果12,表示总共有12个元素
data.size

data = np.arange(12).reshape(3, 4)  # 创建一个3行4列的数组

# 创建一个三行四列的全0数组ones\empty
np.zeros((3,4))

# 数据类型转换为float64
data=data.astype(np.float64)

#获取前两行,前两列的元素
arr2d[0:2,0:2] 

# 获取索引为(1,1)和(3,2)的元素,前面一组是行,后面一组是列
demo_arr[[1,3],[1,2]]  
# 返回哪些值是nan
isnan

# 将‘出生年份(年)’中数据里的‘年’字去除,并把数据的数据类型转换为整型
data['出生年份(年)'] = data['出生年份(年)'].str.replace('年', '').astype(int)
data

数组变换

#表示变成两行,列你帮我计算
arr.reshape(2,-1)

#将数组变成一维数组
arr.ravel()

# 数组合并
arr3=np.hstack(())# 横向
vstack#纵向
concatenate

#数组分割
np.hsplit(arr,2)#横向,切成两份
vsplit#纵向

#数组转置
arr.tanspose((1,0))

#可以从数组当中选出数拼接
np.where()
np.where()

#数组判断
np.all()  #数组都满足括号里的条件,就返回true
np.any()  #数组有一个满足括号里的条件,就返回true

#使用tile函数实现数据重复。
arr = np.array([[1,2,3],[4,5,6]])
```
结果:array([[1, 1, 2, 2, 3, 3],
       [4, 4, 5, 5, 6, 6]])
```

#利用np.where()函数输出结果array([1,6,7]),arr_x =[1, 5, 7],arr_y = [2, 6, 8]
np.where([True, False, True],arr_x,arr_y)

Pandas

series对象

    # series对象
    方法一:
    ser_obj = pd.Series([1, 2, 3, 4, 5],index=['a','b','c','d''e'])
    方法二:
    year_data = {2001: 17.8, 2002: 20.1, 2003: 16.5}
    ser_obj2 = pd.Series(year_data)


    # 获取ser_obj的索引
    ser_obj.index
    # 获取ser_obj的数据
    ser_obj.values

索引操作

如果使用的是位置索引进行切片,则切片结 果是不包含结束位置;如果使用索引名称进 行切片,则切片结果是包含结束位置

    ser_obj[2: 4] # 使用位置索引进行切片
    ser_obj['c': 'e'] # 使用索引名称进行切片


    # 通过不连续位置索引获取数据集
    ser_obj[[0, 2, 4]

    # 创建布尔型Series对象
    ser_bool = ser_obj > 2
    # 获取结果为True的数据
    ser_obj[ser_bool]
    

DataFrame

特点:有行列索引

    pandas.DataFrame(data = None,index = None,columns =None,dtype = None,copy = False )
    index:表示行标签。若不设置该参数,则默认会自动创
    建一个从0~N的整数索引

    # 创建数组
    demo_arr = np.array([['a','b','c'],['d','e','f']])
    # 基于数组创建DataFrame对象
    df_obj = pd.DataFrame(demo_arr)


    #指定列索引
    df_obj = pd.DataFrame(demo_arr,
    columns=['No1','No2','No3'])

在这里插入图片描述

    #用字典创建
    data = {
    'name':['张三', '李四', '王五', '小明'],
    'sex':['female', 'female', 'male', 'male'],
    'year':[2001, 2001, 2003, 2002],
    'city':['北京', '上海', '广州', '北京']
    }
    df = pd.DataFrame(data)
    print(df)


    结果:(自动生成列索引0-3)
         name sex year city
    0 张三 female 2001 北京
    1 李四 female 2001 上海
    2 王五 male 2003 广州
    3 小明 male 2002 北京



    #为数据指定列名
    df2 = pd.DataFrame(data, columns = ['name','year','sex','city','address'])
    print(df2)

查看DataFrame属性

arr.index 在这里插入图片描述

索引

选取行、列

    # 获取行索引
    arr.index
    #列索引
    arr.columns

    # 获取行数据,必须采用切片形式
    方法一:
    arr[:2]
    arr[1:3]
    arr.loc[[1,2]] # 这里的1,2是指定行名称
    
    方法二:
    df5[df5['year']==2001]

    #获取列索引
    arr['列名']
    arr.iloc[['','']] # 括号里同样填名称

选取指定行列

  • iloc:可以选择标签、范围、位置
  • loc: 基于标签,选取列的时候必须是标签。
# 获取行列(以获取)
dataframe_obj.iloc[0:2:,[1,3]]          # iloc用于列,1,3是列的个数下标(从0开始)    
dataframe_obj.iloc[[0,1], 1::2]       # iloc用于列,前面是选取具体列标签,后面是选取行的范围
dataframe_obj.iloc[0:2:, 1::2]        #前后都为范围
dataframe_obj.iloc[[0,1], [1,3]]
dataframe_obj.iloc[[0,1], ['b','d']]  #报错
                   
dataframe_obj.loc[[0,1],['b','d']]     #loc用于行,q前面是行标签,后面是列标签
dataframe_obj.loc[0:1:,['b','d']]        # 前面是行范围,后面是标签

增加数据

# 增加列
df['score]=[85,78,96,80]
# 这样可以指定新增的列到第一列后面,名字叫NO
df.insert(1,'No',[001002,003,004)

#增加行
datal=fcity:兰州name':李红year':2005sex:'female
df.append(datal,ignore index = True)

删除数据

drop:删除指定索引

# 默认按行(axis=0)
#默认数据删除不修改原数据,需要在原数据删除行列需要设置参数inplace = True
#df.drop(df[df['city']=='广州'].index) 返回的是包含广州的数据列的索引
arr.drop(‘名字’,axis=0

修改数据

#可以直接索引到具体位置直接赋值
arr.replace({原来的一个:新的一个})

修改列名

# 把no改成number了
df5.rename(columns={'no':'number'},inplace=True)
~~~python

### 算数运算
~~~python
# 执行加法运算,补充缺失值
obj_one.add(obj_two, fill_value = 0)

排序

按索引

sort_index(axis = 0,level = None,ascending = True,inplace = False,kind =' quicksort ',na_position ='last',sort_remaining = True )

  • axis:轴索引,0表示index(按行),1表示columns(按列)。
  • level:若不为None,则对指定索引级别的值进行排序。
  • ascending:默认为True表示升序。

按值 sort_values(by,axis=0, ascending=True, inplace=False, kind='quicksort',na_position='last')

  • by:表示排序的列(by=2,表示按照列索引为2的进行排序)
  • na_position:若设为first,则会将NaN值放在开头;若设为False,则会将NaN值放在最后

数据汇总

    #按行汇总
    df.sum()
    #列
    df.sum(axis=1)

    # describe()
    输出和、最大最小等数据

数据清洗

空值

pandas.isnull/notnull(obj)  判断空值

删除

# 删除所有含有缺失值的行 
df1 = df.dropna() 

# 删除所有含有缺失值的列
df2 = df.dropna(axis=1) 

# 删除所有元素都是缺失值的行和列 
df3 = df.dropna(how='all') 

# 如果某行或列非缺失值数量小于等于1,则删除该行或列 
df4 = df.dropna(thresh=2)

# 删除特定的行 
df5 = df.dropna(subset=['A'])

# 删除某一列
df.drop('B', axis=1, inplace=True)

填充

s1 = s.fillna(0)
# 使用前一个非缺失值进行向前填充 ,就是上头一下补充下头一个(不是左边补右边,这里的上下是方向)
s2 = s.fillna(method='ffill')

# 使用字典填充缺失值 ,可以指定那一列用什么填充
df1 = df.fillna({'A': 0, 'B': 100})

## 填充某一列为均值
mean_value = df['column_name'].mean() df['column_name'].fillna(mean_value, inplace=True)

重复值

#判断是否有重复值(这里是指行,只有行完全相同才会被判断为相同)
df.duplicated()

#删除重复值
df.drop_duplicates()

数据合并

# 内连接就是取相同,外连接就是取两个全部
#axis=1就是合并列,行不变,就是横向堆叠数据
concat(join='inner'/'outer')
例:
pd.concat([df1,df2],join='outer',axis=1)

merge(df1,df2,how='inner'/'outer'/'left'/'right')
# 以主键'key','B'合并数据,方式内连接。
pd.merge(left,right,on=['key','B'],how='inner')

#合并重叠数据
# 用right的数据填充left缺失的部分
right.combine_first(right)

数据重塑

# 将行变成列,行列转换,指定行列
# pivot,index为行索引,columns列索引
df = pd.DataFrame({ 
'A': ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar'], 
'B': ['one', 'one', 'one', 'two', 'two', 'two', 'one', 'two'], 
'C': [1, 2, 3, 4, 5, 6, 7, 8], 'D': [10, 20, 30, 40, 50, 60, 70, 80] }) 
# 使用pivot()方法进行透视 ,
pivoted_df = df.pivot(index='A', columns='B', values='C') print(pivoted_df)

B one two 
A 
bar 7 4 
foo 1 5

数据转化

# 保留小数
round(data,0)
# 保留整数部分
astype(int)

数据标准化

离差标准化,将数据映射到01 库:from sklearn.preproscessing import MinMaxScaler

原理:
def MinMaxScale(data):
    # 编写离差标准化的函数
    data=(data-data.min())/(data.max()-data.min())
    return data

使用

# 导入MinMaxScaler类
from sklearn.preprocessing import MinMaxScaler

# 创建MinMaxScaler对象
scaler = MinMaxScaler()

# 准备数据,将 '身高(cm)' 列的数据提取并转换为NumPy数组,同时进行reshape以确保是一列的形状
data = np.array(df_basketball['身高(cm)']).reshape(-1,1)

# 拟合Scaler对象,计算并存储数据的最小值和最大值
scaler.fit(data)

# 对数据进行缩放,将缩放后的结果存储回DataFrame中的 '身高(cm)' 列
df_basketball['身高(cm)'] = scaler.transform(data)

标准差标准化

from sklearn.preprocessing import StandardScaler
原理:
def StandardScale(data): 
    data = (data-data.mean())/data.std() 
    return data

使用

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data = np.array(df_basketball['体重(kg)']).reshape(-1,1)
scaler.fit(data)
df_basketball['体重(kg)'] = scaler.transform(data)
df_basketball

鲁棒性

image.png

数据离散化

pd.cut(数据,划分节点)

  • right:包含右节点就定位true,默认是true
  • include_lowest包含左节点
  • labels['老人','小孩']给分出来的每一个组增加了一列,赋值了这个labels
  • precision保留几位小数
例:分出四组(020],(2030]···
bins=[0,20,30,40,50]
df=pd.cut(df1,bins)

#离散后计算每个组的组内的个数
pd.value_counts(pd.cut(ages,[0,35,60,100]))

data['年龄段']=pd.cut(data['年龄(岁)'],bins=bins,labels=['高','中','低'])

哑变量处理

将不是数值的数据转换成数值的
#没有大小关系的数据,我们每次通过编码001,010,等每次只激活一个1,使之能够变成可分析数值
data_test = pd.get_dummies(data_new2, columns=['朝向'])
pd.get_dummies(df)

# 有大小关系,指定代数替换
data_ya['楼层'].replace({'低层':1,'中层':2,'高层':3},inplace=True)

数据聚合与分组

分组

df.gruopby(by='某一行')

按行索引分组

  • 使用Series对象
  • 这样原来的五行就会被分成三组
  • 第一行和第四行一组,因为他们都是a
  • 如果Series长度和原来的不匹配,那么结果只会让有Series的进行分组
ser_obj = pd.Series(['a','b','c','a','b'])
group_obj = df.groupby(by = ser_obj)
for i in group_obj:
    print(i)

按列分组

ser = {'a':'第一组','b':'第二组','c':'第一组','d':'第二组','e':'第二组'}
num=num_df.groupby(ser,axis=1)
for i in num:
    print(i)

按条件分组

def jue(x):
    if x<5:
        return '第一组'
    else:
        return '第二组'
    
df1=df.groupby(df.mean(axis=0).map(jue))
for i in df1:
    print(i)

使用cut,按范围分组

#right表示包不包含右边,ignore_index=True重置索引
bins=[0,20,30,40]
sort=pd.cut(data,bins,right=True,ignore_index=True)

输出某一组的信息,查看分组信息

datak.get_group("a")

聚合

#分组之后计算平均值
df.groupby('key1').mean()

agg(函数):agg([函数,函数,····])可以定义计算后的列名

data_group.agg([("极差" , range_data_group), ("和" , sum)]

# 每列使用不同的函数聚合分组数据:‘a’列求和,‘b’列求均值,‘c’列求极差
print(datak.agg({'a':'sum','b':'mean','c':range_data_group}))

数组转型:transform

# 将df按照‘key’列进行分组,求每组数据每列的均值,并用transform方法将每行数据填充为所属分组每列的均值
df1=df.groupby('key')
df1.transform('mean')

apply

# 调用apply()方法聚合,求每个分组中的最大值
max_values = datak.apply(lambda x: x.max())

image.png