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'])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值