现在总结一下,之前使用过的pandas常用方法,或者小技巧。
(1)根据条件,选取多行数据:
看一个例子:
# @Time :2018/10/27
# @Author :LiuYinxing
import pandas as pd
def demo():
df = pd.DataFrame({'name':['tom', 'jok', 'cat', 'car'], 'score': [98, 66, 78, 100]}) # 创建一个DataFrame
# 获取 name = tom, cat 的信息
getdata = df[df['name'].isin(['tom', 'cat'])]
print(getdata)
# 获取 66 < score < 100 的信息
getdata = df[(df['score'] > 66) & (df['score'] < 100)]
print(getdata)
# 获取 score == 66 or score == 100 的信息
getdata = df[(df['score'] == 66) | (df['score'] == 100)]
print(getdata)
if __name__ == '__main__':
demo()
注意:pandas
按条件获取多行数据时,一般要用数学逻辑符号,例如:&
、|
。逻辑符号不能用 and
、 not
等。
(2)删除操作:
看例子:
# @Time :2018/10/27
# @Author :LiuYinxing
import pandas as pd
def demo():
df = pd.DataFrame({'name':['tom', 'jok', 'cat', 'car'],
'score': [98, 66, 78, 100],
'score1': [98, 66, 78, 100]}) # 创建一个DataFrame
print(df)
# 删除列 -- pop 修改发生在原始的对象上。
df.pop('name')
print(df)
# 按照列名 -- 进行多列删除
# -- axis=1 表示按列方向、
# -- inplace=True 表示在原数据上修改
df['name'] = ['tom', 'jok', 'cat', 'car']
df.drop(['score', 'score1'], axis=1, inplace=False)
print(df)
# 按照序号 -- 进行多列删除
col = [1, 2] # 要删除的列号
df.drop(df.columns[col], axis=1, inplace=False)
print(df)
df = pd.DataFrame({'name':['tom', 'jok', 'cat', 'car'],
'score': [98, 66, 78, 100],
'score1': [98, 66, 78, 100]}) # 创建一个DataFrame
# 删除行 -- drop 原始对象不变,返回删除后的对象。
df.drop(0)
# 删除多行
df.drop([0, 1], inplace=True) # 默认axis=0
print(df)
if __name__ == '__main__':
demo()
注意:pandas
在列删中pop()
是在原实例上的操作,而行删除drop()
,默认是返回删除之后的结果,不修改之前的实例,此外还有一点是,如果 index
有重复的,则会删除多行。其他用法可以继续探究:
drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
# 参数不在解析>_<
(3)合并、关联操作:
pandas 提供的 pd.merge()
函数,可以实现类似于SQL中的join操作。
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
主要参数解析:
参数 | 含义 | 备注 |
| 要合并的两个DataFrame对象 | |
| 按某一列连接 | 两个pd要存在相同的列名,可以是多列 |
| 用那一列作为键 | 可以是列名 |
| 使用哪个pd的索引作为键 | |
| 连接方式 | 与SQL中join操作的连接一样 |
| 对结果进行字典排序 | 有时可提高性能 |
python例子:
# @Time :2018/10/28
# @Author :LiuYinxing
import pandas as pd
def demo():
df1 = pd.DataFrame({'name': ['tom', 'jok', 'cat', 'car'], 'score1': [98, 66, 78, 100]}) # 创建一个DataFrame对象
df2 = pd.DataFrame({'name': ['tom', 'jok', 'cat'], 'score2': [98, 66, 78]}) # 创建一个DataFrame对象
rs = pd.merge(df1, df2, on='name', how='left')
rs = rs.fillna(0) # 缺失值 补全
print(rs)
if __name__ == '__main__':
demo()
(4)缺失数据处理:
还是看例子吧:
# @Time :2018/10/28
# @Author :LiuYinxing
import pandas as pd
def demo():
df = pd.DataFrame({'name': ['tom', 'jok', 'cat', 'car'], 'score': [98, None, 78, None]}) # 创建一个DataFrame对象
# 缺失值 填充
rs = df.fillna(0) # 缺失值 填充为 0
print(rs)
rs = df.fillna(method='pad') # 缺失值 填充向前看齐
print(rs)
rs = df.fillna(method='bfill') # 缺失值 填充向后看齐
print(rs)
# 缺失值 查询
print(df['score'].isnull())
print(df['score'].notnull())
# 删除缺失值
# dropna函数,其中axis参数默认axis = 0行上操作(删除正行,1 则删除整列)
rs = df.dropna(axis=0) # 缺失值 行删除
print(rs)
rs = df.dropna(axis=1) # 缺失值 列删除
print(rs)
if __name__ == '__main__':
demo()
注意:上面这些操作,不在原始的实例上处理,则是返回删除之后的结果。
(5)列类型转换:
astype
强制转换,适合多列。
df[['A', 'B']] = df[['A', 'B']].astype(float)
(6)获取行数和列数:
row_count = len(df.index) # 行数
loc_count = len(df) # 列数