1、查询数据
DataFrame查询数据的方法包括:根据字段、标签、位置、布尔索引、通过query、where进行查询。
1.1 根据字段查询数据
根据字段查询简单理解为根据每一列继续查询,将想要的列拿出再对其进行操作,可以提高效率。
可以通过df.字段名、df[字段名]或df[['字段名']](此种方法可以拿取多列数据,并形成一个新的dataframe)
直接看代码
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randint(0,150,size=(150,3)),
columns=['math','python','english']
)
print(df)
print(df.python)
print(df["math"])
print(df[['math']])
print(df[['math','python']])
1.2根据标签查询数据
标签可以理解为索引(每一行),标签除了默认的数字之外,在定义时可以根据需求进行定义。
通过loc进行操作
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randint(0,100,size=(10,3)),
index=list('ABCDEFGHIG'),
columns=['math','python','english']
)
print(df.loc['A'])#筛选出标签A这一行
print(df.loc[['A']])#将A这一行返回成一个新的DataFrame
print(df.loc[['A','B']])#将AB两行返回成DataFrame
print(df.loc[['A','B'],['math','python']])#左边为标签,右边为字段,即将AB两行的math、python两列返回
print(df.loc['A':'F',['math','python']])#采用分区方法,将A到F行的此两列返回
print(df.loc[:,['math','python']])#单独的‘:’表示所有行
print(df.loc['B'::2])#从B开始隔一个取一个
1.3根据布尔索引查询数据
通过比较运算进行创造布尔条件,通过其值进行查询。值得注意的是其逻辑运算为(&、|、~)
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randint(0,151,size=(2000,3)),
columns=['math','python','english']
)
cond1=df.python>99#其返回值为一个bool类型的series,需要变量进行接受
print(cond1)
df1=df[cond1]
print(df1[['python']])#将cond1作为筛选条件,这里为了只看其中一列,用一个新的dataframe
print(df[df>50])#对df中的所有元素进行判定,其false项会换成NaN
1.4通过query查询数据
query()方法允许使用SQL表达式进行筛选数据
df2=df.query('python>135 and math>120 and english > 100')
print(df2)
1.5通过isin查询数据
语法Data.column_name.isin(需查询的数据) 其返回值为bool类型
print(df[df.python.isin([108])])#使用isin方法查找python分数为108,中括号里也可以为数组
对于where方法的介绍放在4.2中,其也可以对数据进行批量修改
2、增加数据
2.1增加列
语句:DataFrame.['columns_name']=DATA
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randint(0,100,size=(10,3)),
index=list('ABCDEFGHIJ'),
columns=['math','python','english'],
dtype=np.int64
)
s=pd.Series(data=np.random.randint(0,100,size=9),
index=list('BCDEFGHIJ'),
name='pytorch')
print(df)
print(s)
将s添加到df中形成一个columns为pytorch的列,同时可以看到s中没有A的数据。
df['pytorch']=s#在df中添加一列pytorch,根据标签进行对应,未对应的数据为NaN
print(df)
添加成功,且A的pytorch的数据自动填写为NaN,该列其他的数据都带有小数(float类型)
2.2增加行
通过loc进行实现,DataFrame.loc[‘标签/数字’ ]=[需添加的元素]进行。
df.loc['k']=[23,67,87,67]
df.loc[12]=[12,12,12,12]
我们也可以通过循环添加多行/列数据
3、删除数据
3.1删除行列数据
通过DataFrame.drop进行删除
参数:
- labels: 指定要删除的行索引或列名,参数传入方式为字符串或list-like。如果指定的是列名,要配合将axis参数设置为1或columns。
- axis: 设置删除行还是删除列,0或index表示删除行,1或columns表示删除列,默认值为0。
- index: 设置要删除的行,相当于设置labels且axis为0或index。
- columns: 设置要删除的列,相当于设置labels且axis为1或columns。
- level: 如果索引是多重索引,指定按多重索引中的哪个等级的索引删除,可以传入多重索引的下标或名称。
- inplace: 是否原地替换调原来的dataframe。布尔值,默认为False。
- errors: 设置是否抛出错误,可以设置的值有{‘ignore’, ‘raise’},默认raise,表示抛出错误。ignore表示忽略错误,跳过传入的错误索引名或列名,正确的索引名或列名不受影响,正常执行删除。
我们对‘12’行以及pytorch列进行删除(这里inplace参数默认为0,删除的是副本中的数据)
print(df.drop(index=[12],columns=['math']))
3.2 删除空数据
通过DataFrame.dropna()完成
参数:
- axis:0或’index’,表示按行删除;1或’columns’,表示按列删除。
- how:‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列。
- thresh:int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。
- subset:子集。列表,按columns所在的列(或index所在的行)删除。
- inplace:是否原地替换调原来的dataframe。布尔值,默认为False。
围绕A中pytorch的NaN进行尝试。
print(df.dropna(axis=0))
print(df.dropna(axis=1))
参考:Python-pandas的dropna()方法-丢弃含空值的行、列-CSDN博客
4、修改数据
4.1 对整行、整列或指定元素进行修改
df.loc['B']=0
df['math']=0
df.loc['E','python']=0
print(df)
4.2通过where修改数据 (也是查询利器)
DataFrame.where(cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False)
参数
- cond: 一个布尔条件,可以是 DataFrame 或 Series。元素为 True 的位置会保留原值,False 的位置会被替换。
- other: 替换值,默认是 NaN。
- inplace: 是否在原 DataFrame 上进行操作,默认为 False。如果设为 True,将在原 DataFrame 上进行修改。
- axis: 应用条件的轴,默认为 None。
- level: 如果目标是 MultiIndex(层次化索引),可以指定级别。
- errors: 错误处理方式,默认为 ‘raise’。
- try_cast: 尝试转换到相同的类型,默认为 False。
将所有小于60的成绩改成0
print(df.where(df>=60,other=0))
4.3通过fillna填充空数据
DataFrame.fillna(value=,method=,axis=,inplace=,limit=,downcast)
- value:用于填充的空值的值。
- method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法,
pad / ffill表示用前面行/列的值,填充当前行/列的空值,
backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
- axis:轴。0或’index’,表示按行填充;1或’columns’,表示按列填充。
- inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
- limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
- downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
print(df.fillna(method='ffill',axis=0))//未来会弃用
值得关注的是运行时提醒: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
print(df.ffill(axis=1))#可以用这个
参考Python-pandas的fillna()方法-填充空值_pandas fillna-CSDN博客
5、修改数据元素类型
5.1 在创建时进行修改
创建时使用dtype进行修改
df=pd.DataFrame(np.random.randint(0,150,size=(10,3)),
index=list('ABCDEFGHIJ'),
columns=['math','python','english'],
dtype=np.int64
)
5.2使用DataFrame.satype()进行修改
先查看数据类型
print(df.dtypes)
可以看到我们的数据类型变成了float类型,定义的时候前三列都为int型。原因是新增加的列中有个NaN数据 。在进行数据类型修改为int时,如果数据中有个NaN会报错:Cannot convert non-finite values (NA or inf) to integer。
在整个df中前三列为int类型,而第4列为float类型,我们可以采用astype方法进行修改单列元素类型。
df['pytorch']=df['pytorch'].astype(np.int64)
print(df.dtypes)
也可对多列进行修改。
cover_type={'math':str,
'python':str}
df=df.astype(cover_type)
print(df.dtypes)
5.3 使用DataFrame.apply()修改
我们可以将pandas.to_numeric、pandas.to_datetime和pandas.to_timedelta作为参数来应用apply()函数,将一个或多个列的数据类型分别改为数值、DateTime和时间delta。
df[['pytorch','python']]=df[['pytorch','python']].apply(pd.to_numeric)
print(df.dtypes)
5.4使用DataFrame.infer_objects()修改
这个方法通过推断 “对象 “类型列的数据类型来尝试软转换。非对象和不可转换的列则不作任何改变。
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': ['a', 'b', 'c', 'd', 'e'],
'C': [1.1, 2.1, 3.0, 4.1, 5.1]
}, dtype='object')
df = df.infer_objects()
print(df.dtypes)
参考:改变Pandas数据框架中一个或多个列的数据类型|极客教程 (geek-docs.com)
6、随机抽样
使用sample()函数进行随机抽样,其可以从DataFrame中随机选择指定数量的行或列,并返回一个新的DataFrame。
- 语法
dataframe.sample(n=,frac,replace=bool,weights=,random_state,axis=0,ignore_index=False)
参数:
n:指定需要抽取的数量
frac:抽取数量的比例(0-1)
replace:当抽取的数量多于原DataFrame的数量时,将其设为true,可以抽取重复的数据
random_state:抽取随机数据的种子(种子不同生成的随机数不同)
axis:抽取的行或列
ignore_index:是否忽略索引
import pandas as pd
df = pd.DataFrame({'name': ['Alice', 'Bob', 'John', 'Tom'], 'age': [18, 20, 22, 24]})
print(df.sample(frac=0.5))
print(df.sample(frac=0.5, random_state=1))
print(df.sample(n=3))
7、处理重复数据
在pandas中,处理重复数据可以使用drop_duplicates()方法。会返回一个新的dataframe。
语法:
dataframe.drop_duplicates(
subset: Hashable | Sequence[Hashable] | None = ...,
keep: DropKeep = ...,
inplace: Literal[False] = ...,
ignore_index: bool = ...,)
subset:指定数据对比的列
keep:默认为true(保留一条重复的数据),可以设置成false,'first'(保留重复的数据的第一条),'last'(保留重复数据的最后一条)
inplace:是否直接替换
ignore_index:是否忽略索引
import pandas as pd
import numpy as np
data={
'A':[1,2,2,2,4,4,2],
'B':['apple','orange','orange','orange','grape','grape','orange'],
'c':[10,20,20,20,40,40,30]
}
df=pd.DataFrame(data)
print(df)
print(df.drop_duplicates())
print(df.drop_duplicates(subset=['A','B']))
print(df.drop_duplicates(subset=['A','B'],keep='last'))
print(df.drop_duplicates(subset=['A','B'],keep=False))