更换数值
import pandas as pd
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
print("--------更换单个值----------")
# loc和iloc 可以更换单行、单列、多行、多列的值
df1.loc[0,'age']=25 # 思路:先用loc找到要更改的值,再用赋值(=)的方法实现更换值
df1.iloc[0,2]=25 # iloc:用索引位置来查找
# at 、iat只能更换单个值
df1.at[0,'age']=25 # iat 用来取某个单值,参数只能用数字索引
df1.iat[0,2]=25 # at 用来取某个单值,参数只能用index和columns索引名称
print(df1)
新增
import pandas as pd
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
# 在数据框最后加上score一列,元素值分别为:80,98,67,90
df1['score']=[80,98,67,90] # 增加列的元素个数要跟原数据列的个数一样
print(df1)
print("---------在指定位置新增列:用insert()--------")
# 在gender后面加一列城市
# 在具体某个位置插入一列可以用insert的方法
# 语法格式:列表.insert(index, obj)
# index --->对象 obj 需要插入的索引位置。
# obj ---> 要插入列表中的对象(列名)
col_name=df1.columns.tolist() # 将数据框的列名全部提取出来存放在列表里
print(col_name)
col_name.insert(2,'city') # 在列索引为2的位置插入一列,列名为:city,刚插入时不会有值,整列都是NaN
df1=df1.reindex(columns=col_name) # DataFrame.reindex() 对原行/列索引重新构建索引值
df1['city']=['北京','山西','湖北','澳门'] # 给city列赋值
print(df1)
print("----------新增行---------------")
# 重要!!先创建一个DataFrame,用来增加进数据框的最后一行
new=pd.DataFrame({'name':'lisa',
'gender':'F',
'city':'北京',
'age':19,
'score':100},
index=[1]) # 自定义索引为:1 ,这里也可以不设置index
print(new)
print("-------在原数据框df1最后一行新增一行,用append方法------------")
df1=df1.append(new,ignore_index=True) # ignore_index=True,表示不按原来的索引,从0开始自动递增
print(df1)
where条件
# where中有多个条件,要注意两个条件如果是and用&,且条件要用小括号包裹一下
# select * from df where Sun > 0 and Mon < 0 order by Sun desc;
df[(df['Sun'] > 0) & (df['Mon'] < 0)].sort_values('Sun',ascending=False)
# or条件,在DataFrame中使用的是按位或符号:|
# sql: select * from df where Sun > 1 or Set > 1 order by Sun;
df[(df['Sun'] > 1) | (df['Set'] >1)].sort_values('Sun',ascending=False)
空值查询
.isna() .notna()
# 先构造一个带空置的DataFrame
dfna = pd.DataFrame({
"one":pd.Series([1,2,3,np.NaN,5,6]),
"two":pd.Series([1,2,np.NaN,5,6,np.NaN]),
"three":pd.Series([np.NaN,5,6,np.NaN,7,8]),
})
# 查询three列不是空值的全部数据
# SQL:select * from dfna where three is not null;
dfna[dfna['three'].notna()]
'''
one two three
1 2.0 2.0 5.0
2 3.0 NaN 6.0
4 5.0 6.0 7.0
5 6.0 NaN 8.0
'''
# 查询表中three是空值的全部列
# SQL:select * from dfna where three is null;
dfna[dfna['three'].isna()]
'''
one two three
0 1.0 1.0 NaN
3 NaN 5.0 NaN
'''
分组
# 人员基本信息表
fdf = pd.DataFrame({
"name":pd.Series(['Zero','Zoey','Bella','Kat','Sid']),
"age":pd.Series([23,24,23,26,23]),
"gender":pd.Series(['male','female','female','female','male']),
"address":pd.Series(['jinan','nanjing','qingdao','dongjing','dongjing']),
"salary":pd.Series([8888.8,6666.6,1234.5,2345.6,5678.9])
})
# 按性别分组,求出男女的平均工资
fdf.groupby('gender').mean()['salary']
'''
gender
female 3415.566667
male 7283.850000
Name: salary, dtype: float64
'''
#求出男女人数
fdf.groupby('gender').size()
'''
gender
female 3
male 2
dtype: int64
'''
# 分组后对不同列进行不同类型的聚合
# 按照gender进行分组,对salary求平均值,对age求总数
fdf.groupby('gender').agg({'salary':np.mean, 'age':np.size})
'''
salary age
gender
female 3415.566667 3
male 7283.850000 2
'''
连接 Join Union
DataFrame可以使用join()和merge()两种函数进行join操作
union操作使用concat()进行完成
# 创建两个待join的表
df1 = pd.DataFrame({
"key":['A','B','C','D','E'],
"val":np.random.randn(5)
})
df2 = pd.DataFrame({
"key":['C','B','F','H','D'],
"val":pd.Series(np.random.randn(5))
})
# 根据key列进行join操作,内连接
df1.merge(df2,on='key')
# 右外连接
df1.merge(df2, on='key', how='right')
# 左外连接
df1.merge(df2, on='key', how='left')
# 全外连接
df2.merge(df2, on='key', how='outer')
# 全外,上面的全外不是真的全外,要用这种方式才能做到全外连接
pd.merge(df1, df2, on='key',how='outer')
# 合并两个DataFrame并去重
pd.concat([df1, df2]).drop_duplicates()
'''
key val
0 A -0.309694
1 B 1.455732
2 C 0.436620
3 D 0.970044
4 E -0.689002
0 C 0.405784
1 B -0.522076
2 F 0.147848
3 H -1.609153
4 D 1.205187
'''
重命名
df.agg({'g_name': lambda x: len(x.tolist())}).rename({'g_name': 'g_num'}, axis=1)
TopN
sort_valuse(),参数by后跟列名,ascending跟True/False指定排序顺序,跟据多列排序时也可以写为 test.sort_valuse( by = [‘A’,‘B’], ascending = [False, True])
df.nlargest(3,columns='Sun')
df.nsmallest(3,columns='Sun')
# 这里也是top N,但是是基于分组的top N
# assign是添加一列
# 添加的列叫rn
# sort_values是对salary进行排序
# groupby是对gender进行分组
# cumcount是按照上面给定的顺序从0开始给一个顺序号
fdf.assign(
rn=fdf.sort_values(['salary'], ascending=False)
.groupby(['gender'])
.cumcount()+1
).sort_values('name')
# 下面的结果说明了男女中工资从低到高的排序顺序
'''
name age gender address salary rn
2 Bella 23 female qingdao 1234.5 3
3 Kat 26 female dongjing 2345.6 2
4 Sid 23 male dongjing 5678.9 2
0 Zero 23 male jinan 8888.8 1
1 Zoey 24 female nanjing 6666.6 1
'''
去重
# 按指定字段去重, 保留第一个
df3 = df.drop_duplicates(subset=['colA', 'colB'], keep='first')
# 按全量字段去重, 保留最后一个
df4 = df.drop_duplicates(keep='last')