DataFrame常用小知识汇总

文章目录

  • 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日期,转换为datetime
  • 8、类型转换
  • 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’],因为是浅复制。

你可能感兴趣的:(python数据分析,DataFrame,小知识,常用,isin,iloc)