这两天用Python写了个小程序,原理实现部分不难,但是对python语言不熟,过程遇到挺多困难的。而且最后发现评估原则有些没用实现到的。考虑到时间宝贵,就以后再做吧。
代码就不贴了,把一些问题解决方案记录一下:
1.读取csv。注意编码,header指定了表头位置,如果前几行是空行是不用算进来的。比如我的表里表头在第7行,但其实表头前面只有2行是有内容的。
import pandas as pddf=pd.read_csv(file_name,encoding='utf-8',header=2)
这样读出来的类型可能都是object,不利于后续比较计算,可以采用以下方法:
frame[CMAX]=frame[CMAX].astype(int)frame[WUR]=frame[WUR].astype(float)print(frame.dtypes)#检查frame每列的类型
2.根据列名新建一个行数更少的dataframe。
frame=DataFrame(df,columns=[CellName,ENB,CMAX,WUR])
3.删除/选取某行含有特定数值的列。
rows=[x for i,x in enumerate(frame.index) if frame.iat[i,3]=='NIL' or pd.isnull(frame.iat[i,3])]#利用enumerate对frame进行遍历,将无线利用率为'NIL'或为空的列放入rows中frame=frame.drop(rows,axis=0) #利用drop方法将含有特定数值的行删除
4.使用groupby聚合CMAX列最大最小值、WUR列最大最小值。
ResultA=frame.groupby([ENB]).agg({CMAX:['max','min'],WUR:['max','min']})
5.增加列。初始化整列都赋同个值。
ResultA['physicCell']='1'ResultA['freqsameCell']=0
6.获取dataframe的大小。
ResultA.shape#行和列(1200,4)ResultA.shape[0]#行1200ResultA.shape[0]#列4
7.基础操作:数据选取loc、iloc、ix函数
loc函数主要通过行标签索引行数据,划重点,标签!标签!标签!
ResultA.loc[index,'freqsameCell']=1
如果用loc['a']意味着行标签是'a',选取这一行,不能是列标签。
df.loc[df['age']>30,['name','age']]#可以同时对行列进行筛选
iloc 主要是通过行号获取行数据,划重点,序号!序号!序号!
iloc[0:1],由于Python默认是前闭后开,所以,这个选择的只有第一行!
ix——结合前两种的混合索引,即可以是行序号,也可以是行标签。
at:选列是只能是列名,不能是position,获取某个数值的具体位置。
iat:通过标签获取某个数值的具体位置。
df[]只能进行行选择,或列选择,不能同时进行列选择,列选择只能是列名。
8.用iterrows遍历dataframe中的行列标签。
for index,row in ResultA.iterrows():Smax=int(row[(CMAX,'max')])Smin=int(row[(CMAX,'min')])Wmax=float(row[(WUR,'max')])Wmin = float(row[(WUR, 'min')])if Smax>=150 and Smin<250:ResultA.loc[index,'freqsameCell']=1countA=countA+1#print(index)elif Smax>=150 and Smin<250 and tmp>=1.5 and tmp<2 and Wmax>80 and Wmin<50 and Wmax-Wmin>=30:tmp = Smax / SminResultA.loc[index,'freqsameCell']=1countA=countA+1
9.保存csv。如果encoding是utf-8可用.to_csv(filename,encoding='utf-8_sig')方法:
ResultB.loc[ResultB['freqdifferCell']==1].to_csv('频间不均衡扇区.csv', encoding='utf-8_sig')