一.基本操作篇
1.新建
自己定义column_name:
import pandas as pd
df = pd.DataFrame(columns=['col1','col2', 'col3', 'col4'])
延用之前的column_name:
df = pd.DataFrame(columns=list(article_df))csc
将一个list的值赋给某列:
df['B'] = listB
2.统计
- 统计某列某值的个数:
#mydf: dataframe
#mydf['mycolumnname']: mydf中的名为mycolumnname的一列
list(mydf['mycolumnname']).count("xxx") # 其中xxx为想统计的值
- 统计某列的值的枚举
df['column_name'].unique()
3.筛选
参考链接
根据值筛选:
之一:
newdf = df[(df.origin == "JFK") & (df.carrier == "B6")]
之二:
content='672844410'
x=df[df['column_name']==content]
之三:
df.query('code=="000002.SZ"')
多条件:
# 多条件
df.query('code=="000002.SZ" | code=="000006.SZ"')
多条件参考2,输入为list:
import pandas as pd
df = pd.DataFrame({'a':[1, 2, 3, 4, 5, 6],
'b':[1, 2, 3, 4, 5, 6],
'c':[1, 2, 3, 4, 5, 6]})
query_list = [1, 2]
df_2 = df.query('c not in @query_list')[['a', 'b']]
多条件筛选3,包括not in:
参考链接
根据列名筛选:
df['column_name']
看两列:
article_df[['column_name1','column_name2']]
根据行数/列数筛选(iloc):
df.iloc[:5,] #First 5 rows
df.iloc[1:5,] #Second to Fifth row
df.iloc[5,0] #Sixth row and 1st column
df.iloc[1:5,0] #Second to Fifth row, first column
df.iloc[1:5,:5] #Second to Fifth row, first 5 columns
df.iloc[2:7,1:3] #Third to Seventh row, 2nd and 3rd column
看某几列:
1.按多少列
df.iloc[:,[0,1]]
2.按列名
df.loc[:,('列名','列名')]
根据hash_map筛选:
wrong_list = []
map = {'a': 1, 'b': 3, 'c': 7,'d':-1}
for index, row in article_df.iterrows():
aging=row['key']
if key is not None and key in map:
value= map[key]
if value!=-1:
if row['key']!=value:
wrong_list.append(row['key'])
4.遍历行数
参考链接
5.取列名
1.[column for column in df]
2.df.columns.values 返回 array
3.list(df)
4.df.columns 返回Index,可以通过 tolist(), 或者 list(array) 转换为list
6.df与常用类型转化
df ->list:
list = df.values.tolist()
参考链接
list->df:
df=pd.DataFrame(list)
df->array:
x=df.values
两个array合并:
np.hstack((mm.values,nn.values))
将array转化为DataFrame:
pd.DataFrame(np.hstack((mm.values,nn.values)))
7.设置列名
df.columns=['col1']
8.拼接
纯拼接,不考虑id是否相同,用concat,列拼接,axis=1;行拼接,axis=0(默认)
cancot,merge参考链接
一行一行拼接:
df1 = df1.append(df.iloc[0], ignore_index=True)
merge:列拼接
data = pandas.merge(u_data, u_item, on="movie_id", how='left')
data = pandas.merge(data, u_user, on="user_id", how='left')
9.df转csv
df.to_csv ("testfoo.csv" , encoding = "utf-8")
10.筛选 isin
import pandas as pd
df = pd.read_excel('分类标准-新.xlsx')
#list0=[7662,7667,7672,7677,7682,7688,7693,7698,7704,7662,7709,7714,7719,7725,7730,7735,7741,7709,7746,7751,7756,7762,7767,7772,7778,7746,7783,7783]
list0=[7664,7669,7674,7679,7684,7690,7695,7700,7706,7664,7711,7716,7721,7727,7732,7737,7743,7711,7748,7753,7758,7764,7769,7774,7780,7748,5047,5047]
a = df[(df['元素编码'].isin(list0))].index.tolist()
result=[]
for x in list0:
a = df[(df['元素编码']==x)].index.tolist()
print (a[0])
result.append(a[0])
df.ix[result]['章节/元素名称'].tolist()
df.ix[result]['元素名'].tolist()
----
#is_in
a = df[(df['元素编码'].isin(list0))].index.tolist()
11.删除
df=df.drop(['hello'],axis=1)
删除某列
删除
删除某行
# 删除索引为1的行
dftest = df.drop(1, axis=0)
dftest
删除
df.keys()
del df[df.keys()[0]]
df.keys()
12.检查是否有空/none/nan
df.isnull().values.any()
"""
返回值:true为有空;false为无空
“”“
检测非None数量:
df.info(verbose=True, null_counts=True)
上述方法:''检测不出来
df = df[df[fea]=='']
显示有空列的行,太给力了(可以过滤掉dropna之后的漏网之鱼)a
print(frame3[frame3.isnull().T.any()])
13.去除空/none/nan
参考链接
方法1:
删去行:
'''
dropna()方法会删除所有包含NaN值得行,然后返回删除后的数据。
dropna(how = 'all')则删除全部为空值的行,或者检测某列
'''
df.dropna()
df.dropna(how = 'all')
df_filter = df_filter.dropna(subset=["x1","x2"])
方法2:
填充:
有多种填充方法:如填充中位数等,后续补充
# 将NaN值全部转换为0
df.fillna(0)
'''
单列缺失值替换
将df表中年龄列的NaN值全部转化为0
'''
df.fillna({"年龄":0})
'''
多列缺失值替换
将df表中年龄、成绩列的NaN值全部替换成0
'''
df.fillna({"年龄":0,"成绩":0})
'''
某列用均值填充
'''
data['a1']=data['a1'].fillna(data['a1'].mean())
'''
全部用均值填充
'''
data=data.fillna(data.mean())
'''
用每列特征的中位数填充
'''
data.fillna(data.median())
'''
用相邻后面(back)特征填充前面缺失值
'''
data.fillna(method='bfill')
更多填充方式
14.切割
将一个dataframe分为几份
result = np.array_split(df,3)
其中result为list
二.数据分析
1.对于整体数据粗看一下:
df_data_brand.describe()
粗看某列每个元素数量:
df['元素编码'].value_counts()
细看某列每个元素数量(转为dict):
list1 = df3["Alarm_Z"].values.tolist()
dict(zip(*np.unique(lst, return_counts=True)))
画图:
x1= dict1.keys()
y1=dict1.values()
plt.plot(x1,y1,label="xxx")
看df每列的类型:
df.dtypes
df维度信息:
df.info()
看某列的每个值的个数
一些分别看到函数
参考链接
2.常用数据处理函数
1.agg聚合函数
pd['Math'].agg(lambda x:x.max()-x.min())
pd.agg({'Math':['mean','max'],'Height': 'var'})
pd.agg(['mean','max','min'])
2.group by
参考链接
df=df.groupby(by='time').mean()#按time分组,对于time相同的几条数据保留其均值
df=df.reset_index('time')#此时time为索引,因此要将索引恢复为列,并重置索引
算某个特征的值相同的时候,对于其他特征归一化:
最大最小归一化:
df['unify_fea'] = df.groupby(by=['fea1'])['fea2'].apply(lambda x: (x-x.min())/ (x.max() - x.min()))
必须group by,否则会报错;
均值方差归一化:
分位数归一化:
参考链接
for reviewerID, hist in tqdm(data.groupby('user_id')):
pos_list = hist['movie_id'].tolist()
genres_list = hist['genres'].tolist()
rating_list = hist['rating'].tolist()
根据某一个feature groupby
3.排序
df.sort_values(['class','score'],ascending=[1,0],inplace=True)
ascending=0为逆序
4.求很多数组元素的并集,统计出现在数组中的独立元素
做法1:
a_list = [1, 2, 3, 4, 5]
b_list = [1, 4, 5]
ret_list = list(set(a_list).union(set(b_list)))
做法2:
all_sku_set=set()
for item in all_match_list:
all_sku_set.update(set(item))
4.筛选包含
单个筛选:
df[df['地址'].str.contains('北京')]
多个筛选(或):
citys = ['北京', '天津', '上海']
address = '|'.join(citys)
df_new = df[df['地址'].str.contains(address)]
参考链接
5.函数apply用法
增加一列:
方法1:
df["hello"] = df['item'].apply(lambda x:deal_name(x))
方法2:
df['cate'] = df.apply(lambda row:deal_name(str(df['item']),cate_items,row), axis=1)
重新标注:
df_third_cate_analysis1=df_third_cate_analysis1.reset_index(drop=True)
6.去掉百分号+修改一列
python
df_third_cate_analysis1['A2B']=df_third_cate_analysis1['A2B'].apply(lambda x:float(x.strip('%')))
7.dataframe转字典
d = df.set_index('A')['B'].to_dict()
参考链接
8.数据转型:
df.index.astype('int64') # 索引类型转换
df=df.astype('int64') # 所有数据转换为 int64
df=df.astype('int64', copy=False) # 不与原数据关联
td_link_data=td_link_data.astype({'管理域': 'int32'}) # 指定字段转指定类型
td_link_data=td_link_data['管理域'].astype('float') #某一列转换
td_link_data=td_link_data['链路ID'].astype('object') #某一列转换
9.df 的所有列都从int转为str:
df=df.applymap(str)
10.单列去重
df.drop_duplicates(['a'],keep='first',inplace=True)
方法2:
df_filted['shop_id'].unique().tolist()
11.df建一个新的列
参考链接
12.pandas读取大批量数据报错情况,处理方法:
file_reader = pd.read_table(input_file_path,sep='\t', header=None, skiprows=1,quoting=csv.QUOTE_NONE,error_bad_lines=False)
有时因为内存不够,无法一次性读取
13.分列
参考链接
函数描述
A=[1,2,3]
df.explode('A')
如果是str,可以先用map将其转化为list,然后进行explode
df["Genre"] = df["Genres"].map(lambda x:x.split("|"))
df_new = df.explode("Genre")
14.某一行最大值
df.idxmax(axis = 1, skipna = True)
转型后查找
df.astype('float').idxmax(axis = 1, skipna = True)
15.新建索引
把某一列特征作为索引
df.set_index("Animal", inplace=True)
16.找某个特征是第几列
df.columns.get_loc('feature')