pandas
1. pandas中主要有两种数据结构,分别是:Series和DataFrame。
2. Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
基本操作
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
-
df = pd.read_csv(‘train.csv’):读取文件
-
df.head(n):只显示前n条数据
-
df.info():获得DataFrame的详细信息
-
df.index:获取索引范围
-
df.columns:获取列名都有哪些
-
df.dtypes:显示数据类型
-
df.values:获取df的数据
-
pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=[‘a’, ‘b’], columns=[‘A’, ‘B’, ‘C’])
-
pd.Series(data = [1,2,3],index=[‘a’,‘b’,‘c’]):创建Series关键一个是数据,一个是索引
-
df[‘列名’]:获取一列的数据
-
df[[‘列名1’,‘列名2’]]:获取多列数据需要用列表传入
-
df.iloc[]:根据位置去获取信息,可以筛选行以及筛选列
-
df.loc[]:根据索引的值来获取相关信息,可以结合设置索引一起使用,也可以使用bool类型作索引,如
定位行列:data.loc[行索引, 列名] 只定位行:data.loc[行索引] df.loc[df['Sex']=='male','Age']
-
df = df.set_index(‘Name’):设置df的索引,索引可以使用某一列
-
df.describe():获取数据基本统计情况
-
df.groupby(‘分组名’)
#1.直接进行运算 df.groupby('key')['哪一列'].sum() #2.通过numpy进行 df.groupby('key')['哪一列'].aggregate(np.sum())
常用操作
-
df.sort_values(by=‘group’,ascending=False):对某一列排序,ascending:是否升序
-
df.sort_values(by=[‘group’,‘data’],ascending=[False,True]):对两列排序
-
df.drop_duplicates(‘data’):去重
-
df.apply(func, axis=0)
def data_fun(series): if series['data']<6: return 'A' else: return 'B' data['pingjia'] = data.apply(data_fun,axis='columns')
-
map
groupTran = { 'a':'A', 'b':'B', 'c':'C' } data['upper'] = data['group'].map(groupTran)
-
df.assign():重新分配一列
-
df.isnull():查看是否有缺失值,默认按列
-
df.fillna():填充缺失值
数值运算
df.sum():二维默认对列求和
df.sum(axis = 0):对列求和
df.sum(axis = 1):对行求和
df[‘列名’].value_counts(ascending=True, bins=5):统计某一列中各数据的个数,默认按个数降序排列,ascending可以设置按升序排列,bins=5设置5个范围,统计各个范围中数据个数
对象操作
1.修改值
df.replace(to_replace=1, value=100, inplace=True)
to_replace:要替换的值,value:替换成什么值,inplace:是否在原数据上更改
df.loc['行名']['列名']=修改的值
**2.修改索引 **
df.index=[]:直接通过赋值修改索引
df.rename(index={‘a’:‘A’,‘b’:‘B’},inplace=True):通过字典结构来确定谁改成谁
3.添加元素
Series中:
添加一行
s['d']=4
添加多行
s.append(s2,ignore_index=False)
ignore_index为True,则忽略之前的索引,为False则保留之前的索引
DataFrame中:
添加一行
df.loc['索引']=[7, 8, 9]
添加多行
pd.concat([df,df2],axis=0)
axis默认是0,竖着连接,axis=1时水平连接
添加一列
df2['列名'] = [4]
添加多列
print(pd.concat([df2,df3],axis=1))
4.删除元素
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
labels:要删除的列或者行,如果要删除多个,传入列表
axis :轴的方向,0为行,1为列,默认为0
index :指定要删除的行
columns :指定要删除的列
inplace=False,删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe(默认);
inplace=True,在原数据上进行删除操作。
merge操作
合并操作
pd.merge(left,right,on=‘key1’,how=‘outer’,indicator=True)
- on是以什么为键进行合并
当on中的键有多个时,用列表进行传递,同时只会取相同的键进行合并,不相同的自动略去
- how指定outer时,不相同的key也会分条显示,指定left时,左表的键会全部存在
- indicator:指示器,可以显示合并的情况
显示操作
pd.get_option(‘display.max_rows’) :查看最多显示多少行
pd.set_option(‘display.max_rows’,100):修改为最多显示100行
pd.get_option(‘display.max_columns’):查看最多显示多少列
pd.get_option(‘display.max_colwidth’):查看每列最多显示多少个字符
pd.get_option(‘display.precision’) #精度,几位小数
透视表
df.pivot_table(index=‘Sex’,columns=‘Pclass’,values=‘Fare’,aggfunc=‘max’)
index:按照什么来作索引,也可以有双重索引
values:对哪些数据作操作
aggfunc:默认是求平均值,max最大值,count求个数
补充:
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None,)
index
, columns
是必选参数,分别是行索引、列索引
crosstab
归根结底就是按照指定的index和columns统计数据帧中出现(index, columns)的频次。也可以理解为分组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hyzJpK4s-1659164758651)(C:\Users\Judy\AppData\Roaming\Typora\typora-user-images\image-20220729134424703.png)]
时间操作
ts = pd.Timestamp(“2022-07-29 14:33:58”):获取时间戳
ts.month:获取月份
ts+pd.Timedelta(‘5 days’):加上五天
pd.to_datetime(‘2022-07-29’):将字符串转换成时间戳
pd.date_range(start=‘2022-07-29’,periods=10,freq=‘12H’):periods:有几条数据,freq是间隔
Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。
DataFrame.resample(rule,label):
rule: 表示重采样频率,例如‘M’、‘5min’,Second(15)
lable:在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35,默认为lable=‘right’
groupby深入
分组的结果如果不显示,可以通过.count()
去查看
-
df.groupby(函数名,axis=None):自定义函数分组
def get_letter(letter): if letter.lower() in 'aeiou': return 'a' else: return 'b' grouped = df.groupby(get_letter,axis='columns') grouped.count()
-
df.groupby(None).groups:查看分组情况
-
df.groupby(level=‘列名’):按照哪一列进行分组
-
df.groupby(level=0):按照第一列分组
-
df.groupby(None).get_group(‘组名’):查看每组的内容
-
index = pd.MultiIndex.from_arrays(arrars,names=[‘First’,‘Second’]):
arrars = [['bar','bar','baz','baz'], ['one','two','one','two']] index = pd.MultiIndex.from_arrays(arrars,names=['First','Second']) df = pd.DataFrame([[1,2,3],[4,5,6],[5,6,7],[7,8,9]],index = index, columns = ['A','B','C']) df
-
df.groupby([‘A’,‘B’],as_index=False).aggregate(np.sum):分组后进行求和操作,类似的可以与np结合使用,as_index为False时,重新指定索引
-
df.groupby([‘A’,‘B’]).sum().reset_index():
reset_index():重新指定索引
字符串操作
- s.str.lower():将字符变成小写
- s.str.upper():
- s.str.len():显示每个数据的长度
- s.str.strip():去除数据两边的空格
- df.str.replace(‘要替换的’,’替换成的‘)
- s.str.stlit(‘分隔符’,expand=False,n=-1):
expand:为True可以直接将分列后的结果转换成DataFrame
n:分列的次数,不指定默认是根据符号的个数全部分列
-
s.str.contains(‘’):是否包含字符串
-
s.str.get_dummies(sep=‘’):关联分析,返回仅具有二进制值的DataFrame
s = pd.Series(['a','a|b','a|c']) s 0 a 1 a|b 2 a|c s.str.get_dummies(sep = '|') a b c 0 1 0 0 1 1 1 0 2 1 0 1
索引
- s.isin([1,4]):判断s中的元素是否在列表中,如果有就是True,同时s[s.isin([1,4])]返回在列表中的元素
- 二维索引s22.index.isin([(1,‘a’),(0,‘b’)]):判断s22中的索引是否在列表元素中
- df.where(df<0):只显示df中小于0的数据,其余默认为NaN
- df.where(df<0,-df):找出df中小于0的数据,其余默认为-df
- df.query(‘(列名1<列名2 & 其余条件)’):找出符合条件的数据
多重索引
多重索引如果要写别名,names=
这个属性名一定要写,否则报错
1.通过from_arrays()方法创建MultiIndex对象
from_arrays()方法是将数组列表转换为MultiIndex对象,其中嵌套的第一个列表将作为外层索引,嵌套的第二个列表将作为内层索引。
multi_array = MultiIndex.from_arrays(arrays=[['A', 'B', 'A', 'B', 'B'],
['A1', 'A2', 'B1', 'B2', 'B3']],
names=['外层索引', '内层索引'])
测试如下:
value1 = np.arange(10).reshape(5, 2)
df_array = pd.DataFrame(data=value1, index=multi_array,columns=['a','b'] )
print(df_array)
a b
外层索引 内层索引
A A1 0 1
B A2 2 3
A B1 4 5
B B2 6 7
B3 8 9
2.通过from_product()方法创建MultiIndex对象
from_product()方法表示从多个集合的笛卡尔积中创建一个MultiIndex对象
multi_product = pd.MultiIndex.from_product(
iterables=[[0, 1, 2], ['green', 'purple']],
names=['number', 'color'])
value2 = np.arange(12).reshape(6, 2)
df_product = pd.DataFrame(data=value2, index=multi_product,columns=['a','b'])
print(df_product)
a b
number color
0 green 0 1
purple 2 3
1 green 4 5
purple 6 7
2 green 8 9
purple 10 11
两者区别:
form_product():是返回列表的笛卡尔积,如上面例子中外层索引3个,内层索引2个,则共有6个索引
form_arrays():是返回列表,两个列表中元素个数一定要相同,如上述例子中共有5个索引