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()
不会计算NaN
,nunique()
为去掉重复值后进行计数
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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。