pd.DataFrame增删改查

更换数值

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')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值