DataFrame常用小知识汇总

it2026-01-22  3

文章目录

1、基本属性2、按条件筛数据iloc[]和loc[]取数据取某一个值取某一区域的值 df[df[列名]>=某个值]筛某个列只有[值1,值2...]的df isin()筛掉一部分数据后重新做索引 df.reset_index()取几个列作为特征集,构成新的df 3、某一列有多少种值 df['column'].nunique()4、删除某一行或者一列 df.drop()5、列之间或者行之间做逐差df.diff()6、将某一列设置为Index df.set_index()7、obiect日期,转换为datetime8、类型转换9、加一列周期性10、某一列缺失值统计、非缺失值统计(1)某一列缺失值统计、非缺失值统计(2)df每一列缺失值统计(3)df每一行的缺失值统计(4)df整个的缺失值数量 11. groupby常用12、给df重新生成索引13、转换dataframe列的值

1、基本属性

df= pd.DataFrame() 创建一个DataFrame对象 df.values 返回ndarray类型的对象 df.index 获取行索引 df.columns 获取列索引 df.axes 获取行及列索引 df.T 行与列对调 df. info() 打印DataFrame对象的信息 df.head(i) 显示前 i 行数据 df.tail(i) 显示后 i 行数据 df.describe() 查看数据按列的统计信息。建议结合pd.set_option('display.float_format', lambda x: '%.3f' % x),设置显示格式。 dispaly(df.head()) 重命名: df.rename({'oldcol':'newcol'}, axis=1, inplace=True)

df.loc[行索引,列索引] df.loc[行索引:行索引,列索引:列索引] df.iloc[行号,列号] df.iloc[行号:行号,列号:列号]

df[‘new column’]= 10 加了一个新列,该列值全为10

2、按条件筛数据

iloc[]和loc[]取数据

A、iloc按行号和列号取数据。注意:默认初始行号列号从行0、列0开始。 B、loc按行标签和列标签取数据。

取某一个值

用loc: 1、想取index= 74,columns=‘price’,交叉下的那个位置的数据: index为df的index

df.loc[74,'price']

用iloc: 1‘、假如1的这个位置的数据在行号=74,列号=3的位置吗,也可这样写:

df.iloc[74,3]

取某一区域的值

用loc: 1、取index为74-80,columns为’price’这一区域的值

df.loc[74:80,'price']

2、取index为74-80,columns为’price’-'income’这一区域的值

df.loc[74:80,'price':'income']

注意[74:80, ]冒号后面的值取不到,只能取到79。

用iloc: 同样实现上面的小功能。假如’price’为列3,'income’为列4。接下来用iloc实现: 1’、

df.iloc[74:80,3]

2’、

df.iloc[74:80,3:5]#注意是5 只取到4

df[df[列名]>=某个值]

# 取2020-06-06包含这天的数据 df1= df[df['date']>='2020-06-06'] #取完之后,丢掉原索引,重置索引(0,1......) df1= df1.reset_index(drop=True) #大于某个且小于某个: df[(df['avg_price'] >=8900) & (df['avg_price'] < 9050)]

筛某个列只有[值1,值2…]的df isin()

#筛出A列值为'women'的数据 df= df[df['expid'].isin(['women'])] df= df.reset_index(drop=True)

还可以取反筛:

df1=df1[~df1['B'].isin([0])] #通过~取反,选取不包含数字0的行

筛掉一部分数据后重新做索引 df.reset_index()

df= df.reset_index(drop=True) drop=True丢掉原来的索引

取几个列作为特征集,构成新的df

melbourne_features=[‘Rooms’, ‘Bathroom’, ‘Landsize’, ‘Lattitude’, ‘Longtitude’] X= melbourne_data[melbourne_features]

3、某一列有多少种值 df[‘column’].nunique()

df['pid'].nunique()

4、删除某一行或者一列 df.drop()

用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)

参数说明: labels 就是要删除的行列的名字,用列表给定 axis 默认为0,指删除行,因此删除columns时要指定axis=1; index 直接指定要删除的行 columns 直接指定要删除的列 也可以用 del df['该列名'] inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe; inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。

因此,删除行列有两种方式: 1)labels=None,axis=0 的组合 2)index或columns直接指定要删除的行或列

https://blog.csdn.net/songyunli1111/article/details/79306639

5、列之间或者行之间做逐差df.diff()

逐差df.diff()

1、其实是经过了两个步骤,首先会执行: df.shift() 然后再将该数据与原数据做差,即: df-df.shift()

2、函数原型: DataFrame.diff(periods=1, axis=0)

3、参数: periods:移动的幅度,int类型,默认值为1。 axis:移动的方向,{0 or ‘index’, 1 or ‘columns’},如果为0或者’index’,则上下移动,如果为1或者’columns’,则左右移动。

4、返回值 diffed:DataFrame类型

5、应用:仅在某个列上做差 假如x是一个天级别的收入指标,x为历史一年每天的收入。 默认值,今天比昨天增加的,日环比:df['inc_x]= df['x'].diff() 周环比:df['inc_x']= df['x'].diff(7)

6、将某一列设置为Index df.set_index()

假如df有一列为日期,想讲日期设置为行索引:test= df.set_index('date')

7、obiect日期,转换为datetime

pd.to_datetimedf['date']= pd.to_datetime(df['date'],format="%Y-%m-%d") formate格式根据自己的日期格式设置。

8、类型转换

如object转为类别类型。df['description']= df['description'].astype('category')

9、加一列周期性

加入周期性为周一、周二、…周日这种。 加入df[’‘week’]:

""" 周期性 """ def dateToweek(x): week= x.isoweekday() return week df['wenk']= df['date'].apply(dateToweek)

10、某一列缺失值统计、非缺失值统计

缺失值:nan

(1)某一列缺失值统计、非缺失值统计

该列缺失值数量:df['column'].isnull().sum() 非缺失值数量:df['column'].count()

(2)df每一列缺失值统计

各列的: df.isnull().sum() #sum有个默认参数axis= 0 #一个列一个值

(3)df每一行的缺失值统计

各行的:df.isnull().sum(axis= 1)

(4)df整个的缺失值数量

df.isnull.sum().sum() #只是一个值

11. groupby常用

如,统计每天各班各课程的签到人数:

df.groupby(['date','class','course'], as_index=False)['stuNo'] .agg({'count'}).reset_index() df.rename({'count':'qiandaorenshu'}, axis=1, inplace=True)

如果有多个统计,可以在agg({‘count’,‘sum’,‘min’,‘max’,‘value_counts’})写多个。

value_counts: 分组后,统计各组中统计各组中某列的各取值的数目 如,某电商某商品每天有多个价格,统计‘price’列有多少种价格:

#分组后,统计各组中某列的各取值数目 df.groupby('key1')['price'].value_counts() #Series #展开: df.groupby('key1')['price'].value_counts().unstacks() # 等价于 df.groupby('key1')['price'].agg({'value_counts'}).reset_index()

12、给df重新生成索引

生成从0开始,0、1、2…这样的索引:df.reset_index(drop=True, inplace=True) drop=True:抛弃之前的索引

13、转换dataframe列的值

假如dataframe有一列为name,df[‘name’]值为:四医大医院,空军工程大学,三医大医院,西安电子科技大学,粥游记… 列很大 目标:把带有’医院’的统一命名为’医院’,把带有‘大学’的统一命名为‘大学’,其他的不做转换。

name_list= df['name'].values i= 0 for name in name_list: if '医院' in name: name_list[i]= '医院' elif '大学' in name: name_list[i]= '大学' else: pass i +=1

再打印 df[‘name’]就会发现值改变了。更改name_list会更改df[‘name’],因为是浅复制。

最新回复(0)