Pandas 常用操作

一、列操作

1. 列名大写

pd_target.columns = [x.upper() for x in list(pd_target)]

2. 列内容大小写转换:

df2["city"]=df2["city"].str.lower()  #转换成全小写
df2["city"]=df2["city"].str.upper()  #转换成全大写
df2["city"]=df2["city"].str.title()  #转换成首字母大写

3.列合并

pd_base=df['列1'].str.cat(df['列2'])

4. 列名修改

pd_base.rename(columns={'a':'A'},inplace=True) #修改列名a为A

5. 列类型转换

pd_base['one'] = pd.DataFrame(df['one'],dtype=np.float,inplace=True) #写法一
pd_base['列名'] = pd_base['列名'].astype(float)                          #写法二

二. 索引

1. 重置索引

pd_base.reset_index(drop=True,inplace=True)  #drop删除旧索引, inplace替换旧DataFrame

2. 保存数据去掉索引

pd_base.to_csv( '1.csv',index=None)

三、数据CRUD

1.获取单值

df._get_value(索引号,'列名') #索引号默认从0开始0,1.2.3.4...

2. loc

  • pd_base.loc['索引']

    默认按照索引检索:pd_base.loc['索引'],返回索引行的Series(默认索引是数字0123456789)

  • pd_base.loc[:,'列名']

    只能一列,返回的是Series

  • pd_base.loc[:,['列名1','列名2']]

    返回的是DataFrame,并且list中可以写多个列名

3.iloc

pd_base.iloc[int_x,int_y] # 获取坐标(x,y)的值,从(0,0)开始
pd_base.iloc[0:int_x,:] # 选取前多少行

4. 遍历

  • 按行遍历:

    for row in pd_base.itertuples():
        print(getattr(row, '列名1'), getattr(row, '列名2')) # 输出每一行
    
        
    # 对于每一行,通过列名name访问对应的元素
    for row in df.iterrows():
        print(row['c1'], row['c2']) # 输出每一行
  • 按列遍历

    for index, row in df.iteritems():
        print(index) # 输出列名
      print(row) # 以Series形式输出某列

5. 排序

  • 排序

     pd.sort_values("列名",inplace=True, ascending=False)

    inplace=True代表直接替换pd不需要重新赋值

  • 按Rank排序

    SN分组排序TestTime

    pd_mongo_base['复测'] = pd_mongo_base['TestTime'].groupby(pd_mongo_base['SN']).rank(ascending=1, method='first')
  • 是否有值

    if pd_base.empty:
        #如果Dataframe值为空
  • 根据条件筛选并修改

    pd_base.loc[(pd_base['筛选列A']==0 &(pd_base_csv['筛选列B']!='0')),['目标列C', '目标列D']]='NULL'

6. 按条件查

pd_result =pd_base[(pd_base['stripes']>=1) | (pd_base['bars']>=1)]
#多条件注意括号   多条件的或者筛选是用|  并且筛选是用&  不等于是用!=
################另一种写法
pd_group = pd_base.loc[np.where(pd_base['ERROR_CODE'] == error)]

7. GroupBy

pd_grouped = pd_result.groupby(['列名1','列名2'])

分组后可应用聚合函数:

min() max() sum() mean() std() size() count() nunique() first()`last()`

其中size()会计算Nan的值,count()不会计算NaNnunique()为去掉重复值后进行计数

first()`last()`为取出分组后的每组第一行或最后一行

pd_result = pd_grouped.groupby(['列名1','列名2']).size()

对分组后的某列进行聚合:

pd_result = df[['列名1','列名2']].groupby(df['key1']).min()
pd_result = pd.DataFrame(pd_result, columns=['MIN'])  # 将Series结果转DataFrame
pd_result.reset_index(inplace=True) #将得到的DataFrame 格式清洗一下

第一句代码的语法糖写法:

pd_result = df.groupby('key1')[['列名1','列名2']].min()
pd_grouped['数据列1'].agg(np.mean) 对分组后的DataFrame求'数据列1'的平均值

8. 改

  • 列名修改

    df.rename(columns={'a':'A'},inplace=True) #修改列名a为A

9.删

删除包含某个数字的行

row_list = pd_base[pd_base['one'] == 2].index.tolist() # 获得含有该值的行的行号
pd_result = pd_base.drop(row_list)

删除某列包含nan的值

pd_base_result = pd_base[~pd.isnull(pd_base['目标列'])]
# 其中~代表了对结果取反,也就是不取数据集pd_base中['目标列']有nan的行
# 一定要赋给一个新的DataFrame中,虽然笔者暂时也不懂为什么赋给原来的DataFrame中无效

删除列

pd_base.drop(labels=['目标列'],axis=0, index=None, columns=None, inplace=False)
# labels 就是要删除的行列的名字,用列表给定;
# 删除列要指定axis=1;默认为0代表删除行;
# inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。
#--------------------------------------
# 另一种删除方式为指定位置
# index 直接指定要删除的行eg: index=[0, 1]
# columns要删除的列 eg: columns=[0, 1]

四、数据合并

1. 横向合并

直接合并

pd_result = pd.concat(list_mongo_lefts, axis=1)

按索引合并

pd_result =  pd_left.join(pd_right)

按条件合并

result = pd.merge(pd_left, pd_right, how='left', on=['key1', 'key2']) # 左连接 

2. 纵向合并

pd_result = pd.concat(list_mongo_lefts, ignore_index=True)

其中list_mongo_lefts存放着要合并的pandas, ignore_index=True表示忽略索引合并

pd_result.reset_index(drop=True,inplace=True)  #合并后重置索引,替换旧DataFrame

如果要区分来自哪个表,可增加参数keys

3.列合并

pd_base=df['列1'].str.cat(df['列2'])

五、类型转换

1. pd转二维list

list_result = pd.values.tolist()
# 二维List转pd
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]  
df = pd.DataFrame(a, columns=['one', 'two', 'three']) 

Series转list:

s.tolist()

2. Series↔DataFrame

pd_base = pd.DataFrame(series,columns=['列名'])
pd_base = series.to_frame()

3. np.array↔DataFrame

np_base = pd_base.values
pd_base = pd.DataFrame(np_base)

4. 列类型转换

pd_base['列名'] = pd_base['列名'].astype(float) #普通类型转换
pd_base['列名'] = pd_base['列名'].map(ast.literal_eval) #将某列以str类型存储的list转换为list类型

5. pd转字典

list_dict = base_data.to_dict(orient='records')    #将每一行数据转为一个字典,更符合直觉

6. 生成CSV

pd_base.to_csv( '生成文件.csv',index=None, encoding='utf_8_sig')
# index=None 表示生成的文件不包含索引

六、数据清洗

1.数据信息

pd_base.size     #数据数目
pd_base.shape    #数据形状
pd_base.describe()#数据基本信息:数量、均值、中位数、标准差等
pd_base.head()    #数据前几行
pd_base.ndim    #列数
pd_base.axes    #横纵坐标标签名

2. Inf值处理

pd_base = pd_base.replace([np.inf, -np.inf], np.nan)    #之后再处理NAN

3.删除NA值

pd_base = pd_base.dropna() #axis=1 则删除包含空值的列

4. 删除包含空值行/列

pd_base = pd_base.drop( how='any')     #包含空值行; axis=1 则删除包含空值的列
pd_base = pd_base.drop(['标签'],axis=1) #删除某列或者行

删除包含某个数字的行

row_list = pd_base[pd_base['one'] == 2].index.tolist() # 获得含有该值的行的行号
pd_result = pd_base.drop(row_list)

5. 填充NA值

pd_base.fillna(df1.mean())#用平均值填充
pd_base.fillna(0)          #用0填充

6. 删除某列包含nan的值

pd_base_result = pd_base[~pd.isnull(pd_base['目标列'])]
# 其中~代表了对结果取反,也就是不取数据集pd_base中['目标列']有nan的行
# 一定要赋给一个新的DataFrame中,虽然笔者暂时也不懂为什么赋给原来的DataFrame中无效

7. 字符串形式的字典转字典

问题点: 字符串中的Key没有引号

import demjson
msg = "{name: 'CP', id: '', pageno: 1}"
dic = demjson.decode(msg)

8.列数据标准化

pd_base[['目标列']].apply(lambda x : (x-np.min(x))/(np.max(x)-np.min(x)))

七、计算

1. 统计列中各个值出现的次数

df_train.loc[:,'label'].value_counts()

2. 相邻行做差

pd_result = pd_base.diff()

八、Apply()

def get_ch(data):
    aa= result = data['ItemList']
    result = data['ItemList']['Items'][0]['X'][0]
    return int(result)

pd_sn_result['CH'] = pd_sn_result.apply(get_ch,axis=1)

rohan
1 声望0 粉丝

« 上一篇
闭包与装饰器