鱼C论坛

 找回密码
 立即注册
查看: 3318|回复: 6

[技术交流] pandas 得点点滴滴

[复制链接]
发表于 2019-6-1 15:23:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wp231957 于 2024-7-31 09:18 编辑

pandas 之二  请点击这里
pandas 之三  请点击这里

import pandas as pd

>>> df =pd.DataFrame({"a" : ["23456666abcded1","abadsd1585s5fd2","24safsa5da3","sfasd4d4sfsa4"]})  可创建dataframe
>>> df
                 a
0  23456666abcded1
1  abadsd1585s5fd2
2      24safsa5da3
3    sfasd4d4sfsa4
>>> pd.DataFrame(df,columns=["a","b"])  增加新列
                 a   b
0  23456666abcded1 NaN   默认值nan
1  abadsd1585s5fd2 NaN
2      24safsa5da3 NaN
3    sfasd4d4sfsa4 NaN
>>>
>>> b=df["a"].str[1:4]  可切片,不过这样不行
>>> df
                 a
0  23456666abcded1
1  abadsd1585s5fd2
2      24safsa5da3
3    sfasd4d4sfsa4

>>> pd.DataFrame(df,columns=["a","b"])
                 a   b
0  23456666abcded1 NaN
1  abadsd1585s5fd2 NaN
2      24safsa5da3 NaN
3    sfasd4d4sfsa4 NaN
>>> df["b"]=df["a"].str[1:4]   这样切片 并为新列赋值
>>> df
                 a              b
0  23456666abcded1  345
1  abadsd1585s5fd2   bad
2      24safsa5da3      4sa
3    sfasd4d4sfsa4      fas
>>> pd.DataFrame(df,columns=["a","b","c"])
                 a              b     c
0  23456666abcded1  345  NaN
1  abadsd1585s5fd2   bad  NaN
2      24safsa5da3      4sa   NaN
3    sfasd4d4sfsa4      fas   NaN
>>> df["c"]=df["a"].str[:-1]    这个切错了
>>> df
                 a    b               c
0  23456666abcded1  345  23456666abcded
1  abadsd1585s5fd2  bad  abadsd1585s5fd
2      24safsa5da3  4sa      24safsa5da
3    sfasd4d4sfsa4  fas    sfasd4d4sfsa
>>> df["c"]=df["a"].str[-1:]   切最后一位数字
>>> df
                 a    b  c
0  23456666abcded1  345  1
1  abadsd1585s5fd2  bad  2
2      24safsa5da3  4sa  3
3    sfasd4d4sfsa4  fas  4
>>> df["c"]=(df["a"].str[-1:])*15    这个*15是字符串重复15次
>>> df
                 a              b                c
0  23456666abcded1  345   111111111111111
1  abadsd1585s5fd2   bad   222222222222222
2      24safsa5da3      4sa   333333333333333
3    sfasd4d4sfsa4      fas    444444444444444
>>> df["c"]=(int(df["a"].str[-1:]))*15     pandas 不支持int一类的强制转换
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python3\lib\site-packages\pandas\core\series.py", line 93, in wrapper
    "{0}".format(str(converter)))
TypeError: cannot convert the series to <class 'int'>
>>> df["c"]=((df["a"].str[-1:].astype("int")))*15    需要使用astype
>>> df
                 a              b      c
0  23456666abcded1  345  15
1  abadsd1585s5fd2  bad   30
2      24safsa5da3     4sa    45
3    sfasd4d4sfsa4    fas     60
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-12 18:54:02 | 显示全部楼层
本帖最后由 wp231957 于 2019-7-12 19:10 编辑

>>> import pandas as pd
>>> df=pd.read_csv("test.csv",encoding="gbk")
>>> df
   姓名  语文   数学
0  小a  90   94
1  小b  91   95
2  小c  95   99
3  小c  96  100
4  小a  93   91
5  小b  92   96
6  小c  95   94
>>> groupsum = df.groupby('姓名').sum()
>>> groupsum
     语文   数学
姓名
小a  183  185
小b  183  191
小c  286  293
>>> pj=pd.DataFrame(groupsum,columns=["语文","数学","考试次数","语文平均分","数学平均分"])
>>> pj
     语文   数学  考试次数  语文平均分  数学平均分
姓名
小a  183  185   NaN    NaN    NaN
小b  183  191   NaN    NaN    NaN
小c  286  293   NaN    NaN    NaN
>>> pj["考试次数"]=df.groupby('姓名').size()
>>> pj
     语文   数学  考试次数  语文平均分  数学平均分
姓名
小a  183  185     2    NaN    NaN
小b  183  191     2    NaN    NaN
小c  286  293     3    NaN    NaN
>>> pj["语文平均分"]=pj["语文"].astype("int")/pj["考试次数"].astype("int")
>>> pj["数学平均分"]=pj["数学"].astype("int")/pj["考试次数"].astype("int")
>>> pj
     语文   数学  考试次数      语文平均分      数学平均分
姓名
小a  183  185     2  91.500000  92.500000
小b  183  191     2  91.500000  95.500000
小c  286  293     3  95.333333  97.666667
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-12 22:19:32 | 显示全部楼层
wp231957 发表于 2019-7-12 18:54
>>> import pandas as pd
>>> df=pd.read_csv("test.csv",encoding="gbk")
>>> df
import pandas as pd  #如果没有安装 请pip install pandas 或者百度之

df=pd.read_csv("test.csv",encoding="gbk")
groupsum = df.groupby('姓名').sum()
pj=pd.DataFrame(groupsum,columns=["语文","数学","考试次数","语文平均分","数学平均分"])
pj["考试次数"]=df.groupby('姓名').size()
pj["语文平均分"]=pj["语文"].astype("int")/pj["考试次数"].astype("int")
pj["数学平均分"]=pj["数学"].astype("int")/pj["考试次数"].astype("int")
#pj["语文平均分"].round(decimals=2)
#pj["数学平均分"].round(decimals=2)
pj.to_csv("out.csv",float_format = '%.2f')  #pj.to_csv("out.csv",header=0) 不保留列名
print("文件处理完毕")

这里包含保存文件时  小数位数不固定的解决办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-9 21:26:14 | 显示全部楼层
本帖最后由 wp231957 于 2020-3-10 13:44 编辑

本次更新:以html格式导出数据

import pandas as pd

df = pd.DataFrame({
                  '10月份销售' : ['0.477468', '0.195046', '0.015964', '0.259654', '0.856412', '0.259644'],
                  '9月份销售' : ['0.347705', '0.151220', '0.895599', '0236547', '0.569841', '0.254784']
                })
pj=pd.DataFrame(df,columns=["10月份销售","9月份销售","平均销售"])
pj["平均销售"]=(pj["10月份销售"].astype("float")+pj["9月份销售"].astype("float"))/2

print(pj.to_html())

#使用:E:\wp>python tt2.py >a.html
#查看自然是在浏览器里查看  会看到X*Y的html表格

网上资料说是  :  jupyter notebook  里不存在print 列不对齐的现象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-10 13:43:50 | 显示全部楼层
本次更新:获取某列最大值  及该列最大值所在的行索引
import pandas as pd

df = pd.DataFrame({
                  '10月份销售' : ['0.477468', '0.195046', '0.015964', '0.259654', '0.856412', '0.259644'],
                  '9月份销售' : ['0.347705', '0.151220', '0.895599', '0236547', '0.569841', '0.254784']
                })
pj=pd.DataFrame(df,columns=["10月份销售","9月份销售","平均销售"])
pj["平均销售"]=(pj["10月份销售"].astype("float")+pj["9月份销售"].astype("float"))/2
sortpj=pj.sort_values(by='平均销售')
print("原始数据是:\n",df)
print("========================")
print("添加了平均值后数据是:\n",pj)
print("平均销售最大值所在的行索引为:",pj["平均销售"].idxmax())
print("平均销售最大值为:",pj.loc[pj["平均销售"].idxmax(),"平均销售"])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 19:46:20 | 显示全部楼层
本次更新:关于NAN的一些知识点
import numpy as np
import pandas as pd
from numpy import nan as NA
x=pd.DataFrame(np.arange(15).reshape(5,3), index=list('defgh'), columns=list('abc'))
x.loc['e']=None
x.loc['f','b']=None
print(x)
print(x.isnull())   #返回所有NAN  返回值是一个用True False填充的矩阵
print(x.isnull().all(axis=0))  #判断某列是否全NAN
print(x.isnull().all(axis=1))  #判断某行是否是全NAN
print(x.isnull().any(axis=0))  #返回某列是否具备NAN 
print(x.isnull().any(axis=1))  #返回某行是否具备NAN
print(np.where(np.isnan(x))) #(array([1, 1, 1, 2], dtype=int32), array([0, 1, 2, 1], dtype=int32))  返回NAN的行列坐标
print(x.index[np.where(np.isnan(x))[0]] ) #Index(['e', 'e', 'e', 'f'], dtype='object')  返回NAN所在的行 索引(名称)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-20 09:47:49 | 显示全部楼层
>>> df
  xm  score
0  a    100
1  b    150
2  c    200
3  d     80
4  a     20
5  a     57
6  b     66
>>> df.groupby(["xm"]).agg({"sum","count"})
   score
     sum count
xm
a    177     3
b    216     2
c    200     1
d     80     1
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-17 03:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表