Pandas学习
dataframe和array的转化
# dataframe 转化为 array
df = df.values
# array 转化为dataframe
import pandas as pd
df = pd.DataFrame(array)
求DataFrame每行的最值 均值 和
df['max'] = df[[col0, col1, col2]].max(axis=1)
df['mean'] = df[[col0, col1, col2]].mean(axis=1)
df['sum'] = df[[col0, col1, col2]].sum(axis=1)
简单运算
# 数学运算加上具体的一个数字
df['colname'].add(1)
# 计算差
close = df['colname1']
openp = df['colname2']
df['colname_new'] = close.sub(openp)
# 逻辑运算 返回逻辑结果/可以作为筛选的依据
df['colname1'] > 2
df[(df['colname1'] > 2) & df['colname2'] > 15]
# 逻辑运算函数
# 查询
df.query("待查询的字符串")
# 对指定值进行一个判断,从而进行筛选操作
df[df['colname1'].isin([4.19, 2.39])]
计数 value_counts()
对选择某一列或者整个数据表里的每个值进行计数并且排序。
默认情况下:空值是剔除掉的;降序排列;返回的结果是一个Series数组,可以和别的数组进行计算。
1 Series情况下
import pandas as pd
import numpy as np
from pandas import DataFrame
from pandas import Series
s1 = Series(["timo", "mike", "anni", "timo"])
print(s1.value_counts())
# timo 2
# mike 1
# anni 1
# dtype: int64
2 DataFrame情况下
import pandas as pd
import numpy as np
from pandas import DataFrame
from pandas import Series
df1 = DataFrame({"handsome": ["timo", "anni", "timo"], "smart": ["mike", "anni", "mike"]})
print(df1.apply(pd.value_counts))
# handsome smart
# anni 1.0 1.0
# mike NaN 2.0
# timo 2.0 NaN
分组 groupby()
先按照class字段分组,再对sex去重,保留第一个值。
注意:groupby操作是不考虑空值的。
import pandas as pd
df = pd.DataFrame({'class': ['A', 'A', 'B', 'C', 'B', 'B', 'C', 'A', 'B'],
'sex': ['male', 'female', 'female', 'male', 'female', 'male', 'male', 'male', 'male'],
'score_math': [95, 96, 85, 93, 84, 88, 59, 88, 89],
'score_music': [79, 90, 85, 92, 90, 70, 89, 86, 74]})
print(df)
out = df.groupby("class", as_index=False).apply(lambda df:df.drop_duplicates("sex"))
print(out)
输出结果:
class sex score_math score_music
0 A male 95 79
1 A female 96 90
2 B female 85 85
3 C male 93 92
4 B female 84 90
5 B male 88 70
6 C male 59 89
7 A male 88 86
8 B male 89 74
class sex score_math score_music
0 0 A male 95 79
1 A female 96 90
1 2 B female 85 85
5 B male 88 70
2 3 C male 93 92
判断指定列是否(全部)为NaN(空值)
# 判断某列是否有NaN
df[col_name].isnull().any()
# 判断某列是否全部为NaN
df[col_name].isnull().all()
df.isnull().all()
参考链接:空值
选取dataframe的前几行
dataframe1.head(10)
按列统计nan值的个数
cnt = df.isna().sum()
返回dataframe的行数和列数
# 显示行数、列数等
df.info()
# 获取元素的个数
df.size
# 获取行数和列数
df.shape
# 返回列数
df.shape[1]
len(df.columns)
# 返回行数
df.shape[0]
len(df)
梳理某一列值相同 其他哪些列会存在不同值
cols_list = df1.columns.values.tolist()
cols_list.remove(colname0)
difcol_list = []
for col in cols_list:
if len(df1.groupby(colname0)[col].value_counts()) != 1:
difcol_list.append(col)
output_table = pd.DataFrame({'difcols': difcol_list})
按照列A分组,将同一组的列B求和,生成新dataframe
df = df.groupby(columnA)[columnB].sum()
# 生成的数据类型是Series,将其转换为dataframe需要调用Series中的to_frame()方法
df = df.to_frame()
# 取出index生成一列,并删除原dataframe中的index
df[index] = df.index
df = df.reset_index(drop=True)
数据画像
import pandas as pd
df1 = pd.DataFrame({'class': ['A', 'A', 'B', 'C', 'B', 'B', 'C', 'A', 'B'],
'sex': ['male', 'female', 'female', 'male', 'female', 'male', 'male', 'male', 'male'],
'score_math': [95, 96, 85, 93, 84, 88, 59, 88, 89],
'score_music': [79, 90, 85, 92, 90, 70, 89, 86, 74]})
cols_list = df1.columns.values.tolist()
describe_df = df1[cols_list].describe().T
print(describe_df)
# count mean std min 25% 50% 75% max
# score_math 9.0 86.333333 11.067972 59.0 85.0 88.0 93.0 96.0
# score_music 9.0 83.888889 7.801353 70.0 79.0 86.0 90.0 92.0
选取某个属性在指定列表中的所有行记录
df[(df['column_name']).isin(list)]
# 选取不在列表中的行记录,加上‘~’即可
df[~(df['column_name']).isin(list)]
分组比例抽样
import pandas as pd
import math
frac = 0.5
df2 = df1.groupby('colname0').apply(lambda df: df.sample(math.ceil(len(df)*frac)))
df2 = df2.reset_index(drop=True)
多重Index删除
# 每次删除一个index
df1.index = df1.index.droplevel()
df.sample抽样
df.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
n:int, optional
从数据集中随机选取n行数据,不能和frac参数同时使用。如果frac=None,那么n默认为1。
frac:float, optional
从数据集中选取一定比例的数据,不能和n同时使用。如果frac>1,replace必须为True。
replace:bool,default False
是否允许重复抽样,即一条数据多次选取。默认为否。
weight:str or narray-like, optional
为每条数据添加权重。默认为None。如果axis=0,可以直接使用某一列为权重。除非权重的类型为Series,否则权重的长度必须和数据集中所用轴方向的一样长。如果权重和大于1,则会归一化为1。
random_state:int or numpy.random.randomstate.optional
随机数种子,指定随机数种子后,每次选取的结果就固定了。
axis:选择轴向,0(index)或者1(columns),默认是0
参考链接:pandas学习之df.sample
增加一个自增列
# 重建索引,会生成从0开始的新索引,列名为Index
df = df.reset_index()
# 新增自增列(尝试了一下出现问题,待解决)
df['counter'] = range(len(df))
替换无穷大值或Nan
import numpy as np
df.replace(np.Inf, 1000000)
df.replace(np.nan, 0)
比较两个DataFrame是否完全一模一样
# 只有会在不相等时 抛出
from pandas.testing import assert_frame_equal
assert_frame_equal(df1, df2)
# 返回是False/True
df1.equals(df2)
df1['cols1'].equals(df2['cols'])