1 行/列/单元格 选择
1.1 通过索引选择
选择行(2种方法):
dataframe.loc[行索引]
dataframe.loc[[行索引],:]
选择列(2种方法):
dataframe[列索引]
dataframe.loc[:,[列索引]]
1.2 通过位置选择
(用法与通过下标选择神似)
选择行(2种方法):
dataframe.iloc[行位置] # 0为第一个
dataframe.iloc[[行位置],:]
选择列(2种方法):
dataframe[列位置]
dataframe.loc[:,[列位置]]
1.3 得到指定区域/单元格
通过行索引+列索引得到指定区域:
dataframe.loc[[行索引],[列索引]] # 可以直接得到单元格的值
通过行位置+列位置得到指定区域:
dataframe.iloc[[行位置],[列位置]]
当 索引or位置为一个具体的值的时候就会锁定唯一的单元格
2 循环处理数据
2.1 直接循环行
这个方法暴力简单,博主初学的时候经常这样做...
循环Dataframe的每一行:
for index,row in df.iterrows():
# index 为行索引
# row 为Dataframe这一行数据组成的Series类型的对象
# 使用 row['列索引']得到想要的具体值
循环Series的每一行:
for row in series:
# row就是每一行的数据
2.2 循环Dataframe的每一行/列 apply()
逐行循环:
def sov(x):
# return x[列索引] # 相当于逐行读取Dataframe
dataframe['新列'] = dataframe.apply(sov,axis=1)
逐列循环:
def sov(x):
# return x[0] # x为每一列构成的Series
dataframe.apply(sov)
2.3 循环Series的每一行 map()
def sov(x):
# return x # 对Series每个元素的处理逻辑
dataframe[索引].map(sov)
2.4 循环处理每个元素 applymap()
def sov(x):
# return x # 对Dataframe每个元素的处理逻辑
dataframe.applymap(sov)
它会先逐列,再逐个地循环执行函数
2.5 pandas对一列隔行计算
这里巧用apply函数:
def get_first_difference(x):
# 这里计算了一阶差分
# shift(1) 至数据向下移一位后这个位置的数据,可以认为是上一个值,如果没有值,则为NaN
return x - x.shift(1)
dataframe = dataframe.apply(get_first_difference)
3 内容筛选
3.1 根据索引删除行/列
删除列:
dataframe.drop([列索引],axis=1,inplace=True) # 直接在原有dataframe上处理,不需要接收返回值
删除行:
dataframe.drop([行索引],axis=0,inplace=True) # 直接在原有dataframe上处理,不需要接收返回值
3.2 按条件筛选
3.3 特殊筛选方法
3.3.1 去掉重复数据
Series经过处理后,原来series中每个不同的值都只会出现一次。
series.drop_duplicates(inplace=True)
Dataframe同样适用这个方法处理数据
dataframe.drop_duplicates(inplace=True)
但是默认的参数会全部相同,才会去除,如果判定某些列中有相同的内容就删去这些行,那么就可以使用:
movies.drop_duplicates(['指定列'], 'first', inplace=True)
3.3.2 去掉空值
dataframe.dropna(inplace=True)
3.4 统计Dataframe某一列/series 的不同值
dataframe['列名'].value_counts()
series.value_counts()
3.5 删除Dataframe前N行或后N行
dataframe.dorp(dataframe.head(n).index,inplace=True) # 从头去掉n行
dataframe.drop(dataframe.tail(n).index,inplace=True) # 从尾部去掉n行
4 索引/数值/类型替换
4.1 转置
dataframe.T
4.2 修改行/列索引
修改行索引:
dataframe.index = [新行索引]
# 行索引的总数需要与行数相等
# dataframe.index = list(range(0,dataframe.shape[0])) # 直接得到从0开始递增的下标序列
修改列索引:
dataframe.columns = [新的列索引] # 索引总数与列数相等
# 下面的代码可以生成从0开始递增的列索引
#dataframe.columns = list(range(0,dataframe.shape[1]))
4.3 Dataframe转list
# index转list
list(dataframe.index)
# values转list
dataframe.values.tolist()