DataFrame数据的操作

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)
df
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))
axis=1
axis=0

参考: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数据框架中一个或多个列的数据类型

参考:改变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))

 

df
drop_duplicates()
(subset=['A','B'])
subset=['A','B'],keep='last'
subset=['A','B'],keep=False

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值