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
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
# 取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)]
#筛出A列值为'women'的数据
df= df[df['expid'].isin(['women'])]
df= df.reset_index(drop=True)
还可以取反筛:
df1=df1[~df1['B'].isin([0])]
#通过~取反,选取不包含数字0的行
df= df.reset_index(drop=True)
drop=True丢掉原来的索引
melbourne_features=[‘Rooms’, ‘Bathroom’, ‘Landsize’, ‘Lattitude’, ‘Longtitude’]
X= melbourne_data[melbourne_features]
df['pid'].nunique()
用法: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
逐差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)
假如df有一列为日期,想讲日期设置为行索引:test= df.set_index('date')
pd.to_datetimedf['date']= pd.to_datetime(df['date'],format="%Y-%m-%d")
formate格式根据自己的日期格式设置。
如object转为类别类型。df['description']= df['description'].astype('category')
加入周期性为周一、周二、…周日这种。
加入df[’‘week’]:
"""
周期性
"""
def dateToweek(x):
week= x.isoweekday()
return week
df['wenk']= df['date'].apply(dateToweek)
缺失值:nan
该列缺失值数量:df['column'].isnull().sum()
非缺失值数量:df['column'].count()
各列的: df.isnull().sum()
#sum有个默认参数axis= 0 #一个列一个值
各行的:df.isnull().sum(axis= 1)
df.isnull.sum().sum()
#只是一个值
如,统计每天各班各课程的签到人数:
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()
生成从0开始,0、1、2…这样的索引:df.reset_index(drop=True, inplace=True)
drop=True:抛弃之前的索引
假如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’],因为是浅复制。