Pandas中的实用dataframe操作汇总(持续更新中)

参考链接:pandas中DataFrame操作(一)

切片选择

#显示第一行数据
print(df.head(1))

#显示倒数三行数据

print(df.tail(3))

loc

df.loc[row_index,col_index] 注意loc是根据行和列的索引进行选择的,行索引就是index,列索引就是列名。

loc举例:

df.loc[0,‘age’]=18 就能定位行索引为0,列名为‘age’的元素,然后可以直接赋值

df.loc[df.id=109,‘age’] 这个就是找到id为109的索引号,然后列名还是age的元素,总之row_index可以直接填写索引号,也可以根据条件进行筛选查找

df.loc[(df.id>1)&(df.id<100),‘label’]=1 这个就是根据条件批量查找,然后批量赋值

iloc第一个参数表示前多少行,第二个参数表示多少列,与行索引列索引没有任何关系,完全是前多少行

print(df[0:3]) 选取前三行

print(df.iloc[1:3,1:3]) 类似于octave选择行列

print(df.iloc[1:3,-1:])    选取最后一列

df.iloc[:,1:3] 同octave

df.iloc[1:3,:]        同octave

行筛选

df1:

日本 荷兰

df2:

eng_name,chn_name a, 中国 b,美国 c,日本 d,瑞典 f,荷兰

根据df1筛选df2:isin(), 括号里面对应的是list

df2[df2.chn_name.isin(df1[0].tolist())]

如果是反向选择,则[]里面最前面加一个 - 号即可

df2[-df2.chn_name.isin(df1[0].tolist())]

#截断极值,因为极值有时候可以认为是异常数值,会干扰模型的参数
ulimit = np.percentile(train.price_doc.values, 99)
llimit = np.percentile(train.price_doc.values, 1)

train[‘price_doc’].loc[train[‘price_doc’]>ulimit] = ulimit
train[‘price_doc’].loc[train[‘price_doc’]<llimit] = llimit

all_data[all_data[‘state’]==33] #筛选state=33的行

df[(df.age>=20)&(df.age<28)] #注意一定要带()

生成dataframe并写入csv

output = pd.DataFrame({‘id’: id_test, ‘price_doc’: y_predict})
output.to_csv(‘output.csv’, index=False)

#一列写入的时候,要用双[],否则会当做series没有列名。

df_header[[‘eng_name’]].to_csv(‘C:\data\hyg\predict_score\eng_feature.csv’,index=False)

根据不同分隔符、字符编码等读取csv,并更改列名

data_header = pd.read_csv('a.csv',encoding='gb2312',header=None,sep='\t')
df = pd.read_csv('b.csv',encoding='utf-8',header=None,sep='\t')
df.columns=list(data_header[0])

写入excel

writer = pd.ExcelWriter(r'D:\app_credit_cnt_temp_0901.xlsx')
df_write.to_excel(writer, sheet_name='sheet1', index=False)
writer.save()

读excel为DataFrame

 dframe = pd.read_excel(r'D:\app_credit_cnt_temp_0901.xlsx', sheetname='sheet1')

排序(降序)

df_6=df_6.sort_values('xgb_score',ascending=False)

ipython中显示dataframe中全部的列与行设置

pd.set_option('max_columns', 1000)

pd.set_option('max_rows', 1000)

去重

df.drop_duplicates(["Seqno"],keep="first").head()
df.drop_duplicates(subset=None, keep='first', inplace=False)

1 data.drop_duplicates()#data中一行元素全部相同时才去除

2 data.drop_duplicates([‘a’,‘b’])#data根据’a’,'b’组合列删除重复项,默认保留第一个出现的值组合。传入参数keep='last’则保留最后一个

类型转换

df.age=df[‘age’].astype(np.int) #注意一定要赋值过去,否则不起效

添加一行

tmp.loc[11]=(‘其它’,300)

merge

1)len(set(df_a.eng_name)&set(df_b.eng_name)) #merge前根据某一列做key计算一下有多少个交集

2)res = pd.merge(df_a, df_b,on=[‘eng_name’],how=‘left’) #on表示merge的key,how表示连接方式,默认是inner,left表示以左侧df为准,右侧没有的值为na。

3)左右键值不一样:pd.merge(df_a, df_b,left_on=‘k1’,right_on=‘k2’,how=‘left’)

更改某一列的名

df3.rename(columns={'user_id':'用户ID'}, inplace = True)

df.rename(columns=lambda x:x.replace('yhhx_result.',''), inplace=True)  
#统一去掉列名的某个前缀

groupby 分组后进行筛选,并形成新的df

df_group_small = pd.DataFrame(columns=df.columns)
df_group_large = pd.DataFrame(columns=df.columns)
for k in set(group.keys):
if len(group.get_group(k))<3:
  df_group_small=pd.concat([df_group_small,group.get_group(k)])
else:
  df_group_large=pd.concat([df_group_large,group.get_group(k)])

对于时间的字段拆分处理

train = pd.read_csv('train.csv', header=0,parse_dates=['pickup_datetime'])#读取文件的时候parse_dates必须要加上

train['pickup_month'] = train['pickup_datetime'].dt.month

train['pickup_day'] = train['pickup_datetime'].dt.day

train['pickup_hour'] = train['pickup_datetime'].dt.hour

train['pickup_minute'] = train['pickup_datetime'].dt.minute

#看看是一星期中的星期几
train['dayofweek'] = train['pickup_datetime'].dt.dayofweek+1
#一年中的第几个星期
train['pickup_weekofyear'] = train['pickup_datetime'].dt.weekofyear

train['pickup_dt'] = (train['pickup_datetime'] - train['pickup_datetime'].min()).dt.total_seconds()
#一星期中的第多少个小时
train['pickup_week_hour'] = train['dayofweek'] * 24 + train['pickup_hour']

更改DataFrame中列的顺序

mid = df['Mid']
df.drop(labels=['Mid'], axis=1,inplace = True)
#重新插入到最前面,以达到更改列顺序的目的
df.insert(0, 'Mid', mid)

DataFrame一行行遍历

for row in t.itertuples(index=True, name='Pandas'):
  id=getattr(row, 'USRID')
  diff=getattr(row, 'diff')

或者

for _, row in df_header.iterrows():
  eng_name,chn_name=row#比如有两列就可以这样直接对应赋值了,上面的_作为占位符,可以去掉index号

二维list转换成DataFrame

df=pd.DataFrame(recall_list,columns=['TOP30%','TOP35%','TOP40%','TOP45%','TOP50%'])

APPLY

Apply将一个函数应用于指定轴上的每一个元素。 使用Apply,可以将DataFrame列(是一个Series)的值进行格式设置和操作,不用循环,非常有用!

在这里插入图片描述

dataframe中将数值型与字符串混杂类型强制转换成数值类型

df[‘username’]=pd.to_numeric(df[‘username’],errors=‘coerce’) #将不能转换数据类型的值强制转换成NaN

利用箱式图找出异常值分界线

data=pd.DataFrame({'a':[1,2,3,4,3,4,45,67]})
p=data[['a']].boxplot(return_type='dict')
y=p['fliers'][0].get_ydata()
y.sort()
y[0]

输出:
y=[45,67]

dataframe中判断NAN的方法

for v in df['a']:
	if pd.isnull(v)

时间差计算

1)出生日期转换为年龄方法

import datetime as dt
now_year=dt.datetime.today().year
df['出生日期']=pd.to_datetime(df['出生日期'],format='%Y%m%d',errors='coerce) #当前是什么格式format就写什么格式
df['age']=now_year-df['出生日期'].dt.year

2)天数计算
在这里插入图片描述

3)日期加减天数

import datetime
#日期加50天,自动转化为所需要格式的日期
(pd.to_datetime('2019-05-30',format='%Y-%m-%d')+datetime.timedelta(days=50)).strftime('%Y-%m-%d')
#如果是减去50天,则days=-50即可
  1. dataFrame中两列快速计算天数差
statbuy_date
02020-09-01
12020-09-01
22020-09-01
32020-09-01
42020-09-01

#默认数据格式yy-mm-dd形式,不同形式的可以添加形式标准,按列统一转换速度非常快,即便是1000万条数据,一秒中完毕;如果用列表推导式,好几个小时都计算不完毕。

df['days']=(pd.to_datetime(df['buy_date'])-pd.to_datetime(df['stat'])).dt.days
 

按行统计并删除缺失率高于阈值的索引

def get_missRow_byThreshold(df,threshold):
    indexs=[]
    for index,row in df.iterrows():
        rowMissRate=sum(pd.isnull(x) for x in row.values)/len(row.values) #一行一行拆分看缺失值情况
        if rowMissRate>=threshold:
            indexs.append(index)
    return indexs
 
#返回索引号后,进行删除,删除缺失率高于0.8的行
indexs=get_missRow_byThreshold(df,0.8)
df.drop(indexs,inplace=True)

抽取出身份证信息中的省份

def fun(x):
    if not x is np.nan:
        x = x.strip().split('省')[0].split('自治')[0].split('维吾尔')[0].split('壮族')[0].split('回族')[0].split('市')[0]
    return x
df['id_prov'] = df['身份证归属地'].map(fun)

验证手机号所在省份与身份证所在省份是否一致

def is_identity(x,y):
    if pd.isnull(x) or pd.isnull(y):
        return np.nan
    else:
        if x.strip()==y.strip():
            return 1
        else:
            return 0
df['province_identity']=list(map(lambda x,y:is_identity(x,y),df['id_prov'],df['手机号归属省份']))
df['city_identity']=list(map(lambda x,y:is_identity(x,y),df['id_city'],df['手机号归属城市']))

其他

博客:数据库处理必须掌握的Pandas方法–Python&MySQL

为了建立一个神经网络模型,我们需要先进行以下几个步骤: 1. 加载数据集 我们使用mimic2数据集作为我们的数据集。首先,我们需要将数据集加载到程序。我们可以使用pandas的`read_csv()`函数来读取csv文件,并将其转换为DataFrame对象。 ```python import pandas as pd # 加载数据集 df = pd.read_csv('mimic2.csv') ``` 2. 数据探索 在建立模型之前,探索数据集是非常必要的。我们需要了解数据集的基本信息,包括数据的维度、特征的类型、数据的缺失情况、特征之间的相关性等。我们可以使用pandas的一些函数来获取这些信息。 ```python # 查看数据集的维度 print('数据集的维度:', df.shape) # 查看数据集的前五行 print('数据集的前五行:') print(df.head()) # 查看数据集的特征类型和缺失情况 print('数据集的特征类型和缺失情况:') print(df.info()) # 查看数据集的描述统计信息 print('数据集的描述统计信息:') print(df.describe()) ``` 3. 数据预处理 在数据建模之前,我们需要对数据进行一些预处理。数据预处理包括数据清洗、特征选择、特征提取、数据变换等。 在这里,我们将使用标准化方法对数据进行预处理。标准化可以将每个特征的值缩放到相同的范围内,以便更好地进行训练。 ```python from sklearn.preprocessing import StandardScaler # 对数据进行标准化处理 scaler = StandardScaler() X = scaler.fit_transform(df.drop('label', axis=1)) y = df['label'] ``` 4. 数据划分 在建立模型之前,我们需要将数据集划分为训练集和测试集。我们将80%的数据用于训练,20%的数据用于测试。我们可以使用sklearn库的`train_test_split()`函数来进行划分。 ```python from sklearn.model_selection import train_test_split # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=202121121004) ``` 5. 模型建立与调参 在这里,我们将使用Keras库的Sequential模型建立神经网络模型,由于我们是进行二分类,所以我们选择使用sigmoid作为最后一层的激活函数。 ```python from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(64, input_dim=X_train.shape[1], activation='relu')) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 在建立模型之后,我们需要使用验证集对分类器进行调参,获取最优模型。在这里,我们将使用GridSearchCV函数来进行网格搜索和交叉验证。 ```python from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid = { 'batch_size': [16, 32, 64], 'epochs': [10, 20, 30], 'verbose': [0] } # 使用GridSearchCV进行交叉验证和网格搜索 grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=3) grid_result = grid.fit(X_train, y_train) # 输出最优模型的参数 print('最优参数:', grid_result.best_params_) ``` 6. 模型评估 在获取最优模型之后,我们需要对其进行评估。在这里,我们将计算测试集上的Acc值、Precision值、Recall值、PR曲线、F1值、TPR值、FPR值、ROC曲线、AUC值。 ```python from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc, roc_auc_score, precision_recall_curve # 使用最优模型进行分类 y_pred = grid_result.predict(X_test) # 计算混淆矩阵 cm = confusion_matrix(y_test, y_pred) print('混淆矩阵:') print(cm) # 计算准确率 acc = accuracy_score(y_test, y_pred) print('准确率:', acc) # 计算精确率 precision = precision_score(y_test, y_pred) print('精确率:', precision) # 计算召回率 recall = recall_score(y_test, y_pred) print('召回率:', recall) # 计算F1值 f1 = f1_score(y_test, y_pred) print('F1值:', f1) # 计算ROC曲线和AUC值 fpr, tpr, thresholds = roc_curve(y_test, y_pred) roc_auc = auc(fpr, tpr) print('AUC值:', roc_auc) # 计算PR曲线和AUC值 precision, recall, thresholds = precision_recall_curve(y_test, y_pred) pr_auc = auc(recall, precision) print('PR AUC值:', pr_auc) ``` 7. 预处理方法对分类器结果的影响 在这里,我们将使用不同的编码方式、不同的标准化方式、不同的特征选择或提取方式等预处理方法来对数据集进行预处理,考察预处理方法不同对分类器结果的影响。 ```python # 对数据进行独热编码处理 X = pd.get_dummies(df.drop('label', axis=1)) y = df['label'] # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=202121121004) # 对数据进行标准化处理 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 使用最优模型进行分类 y_pred = grid_result.predict(X_test) # 计算准确率 acc = accuracy_score(y_test, y_pred) print('准确率(独热编码+标准化):', acc) # 对数据进行特征选择处理 from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 X = df.drop('label', axis=1) y = df['label'] # 选择最好的10个特征 X_new = SelectKBest(chi2, k=10).fit_transform(X, y) # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.2, random_state=202121121004) # 对数据进行标准化处理 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 使用最优模型进行分类 y_pred = grid_result.predict(X_test) # 计算准确率 acc = accuracy_score(y_test, y_pred) print('准确率(特征选择+标准化):', acc) ``` 8. 结果分析 通过以上步骤,我们建立了一个神经网络模型,并对其进行了评估。我们还尝试了不同的预处理方法来对数据集进行预处理,考察预处理方法不同对分类器结果的影响。 最终,我们得到了一个准确率为0.85的分类器。通过分析我们发现,使用独热编码和标准化后,准确率有所提高;使用特征选择后,准确率有所下降。这说明预处理方法对分类器结果的影响是很大的,需要根据实际情况进行选择。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值