常用DataFrame操作
数据挖掘竞赛中,表格类型数据往往以多表的形式出现,这给我们进行表格处理造成了一定困难。下文对常见多表格处理方式进行了举例。
选取满足条件的行,索引未重置,可做修改
train_data.loc[train_data['earlies_credit_mon']>timeMax,'earlies_credit_mon' ] = train_data.loc[train_data['earlies_credit_mon']>timeMax,'earlies_credit_mon' ]+ 100
选取满足多种条件的行
tmp[(tmp['std'] != 0) & (tmp['std'] != np.nan)]
删除特征群
col_to_drop = ['issue_date', 'earlies_credit_mon']
train_data = train_data.drop(col_to_drop, axis=1)
标签后置
y=train_inte['is_default']
train_inte['isDefault']=y
选取两表中相同的,独有的属性
tr_cols_train = set(train.columns)
same_col = list(tr_cols_train.intersection(set(test.columns)))
only_cols_train=list(tr_cols.difference(set(test.columns)))
tr_cols_test = set(test.columns)
only_cols_test=list(tr_cols_test.difference(set(train.columns)))
以空值填充表格
for col in Inte_add_cos:
train_inteSame[col] = np.nan#以预测值充当空值
另一表格的内容作为数据筛选的条件
InteId = IntePre.loc[IntePre.isDefault<0.065, 'loan_id'].tolist()#0.065是边缘值
use_te = train_inteSame[train_inteSame.loan_id.isin( InteId )].copy()
重置索引,在通过行索引选取数据前使用
data = pd.concat([ train_data,test_public,use_te]).reset_index(drop=True)
在循环中对列命名,命名含有变量
for k in range(2):
train[f's{k}']=0
选取表格中蕴含特征的样本(有一特征不为空都算)
f_nan=f.drop(['f1','f22','core_cust_id'],axis=1)
def notnull(train_data):
a=train_data.isnull().all(axis=1)
c=~a
b=f[c]
b=b.reset_index(drop=True)
return b
f_notnan=notnull(f_nan)
选取表格中完整样本(有一特征为空都不算)
f_nan=f.drop(['f1','f22','core_cust_id'],axis=1)
def notnull(train_data):
a=train_data.isnull().any(axis=1)
c=~a
b=f[c]
b=b.reset_index(drop=True)
return b
f_notnan=notnull(f_nan)
表格重命名
test_preds=test_preds.rename({'loan_id': 'id'}, axis=1)
表格整体重命名
df.columns=['1','2','3']
选取某列所有非空数据,或空数据
train = data[data['isDefault'].notna()]
test = data[data['isDefault'].isna()]
当表格长度不同依然想采用条件筛选时
#通过条件筛选得到bool索引,再通过判断得到行索引进行选取
a=[1,2,3,4,np.nan,5,6]
a=pd.DataFrame(a)
#选取非空数据
a_1=a.isnull().T.any()
c=~a_1
a_1=a[c]
b=[1,2,3,4,7,5,6]
b=pd.DataFrame(b)
#布尔索引数字行索引转换
def TF(x):
temp=[]
for i in range(len(x)):
if x[i]==True:
temp.append(i)
return temp
index=list(a_1[0]==5)
index=TF(index)
#通过行索引进行选取
ans=b.iloc[index,:]
对列名为数字的列进行选取
#0为列名
submission=submission.drop(0,axis=1)
在使用value_counts或groupby后将行索引转变成特征
df=df.reset_index()
将Dataframe转为数组
df=df.values
将Dataframe顺序打乱
X_train=X_train.sample(frac=1)
将Dataframe按规律分块后,处理后添加到列表中,最后再转为DataFrame
from tqdm import tqdm
s_['identity']=-1
s_final=[]
for i,core in tqdm(enumerate(s6)):
s_temp=s_[s_.s6==core]
s_temp['identity']=i
s_final.append(s_temp)
s_final=pd.concat(s_final)
对DataFrame中的某一些列进行特征值的设置
#is_valid不包含在原train中
train.loc[train.a3=='2021-09-01','is_valid']=1
对某一特征列进行确定值填充
train['is_valid'].fillna(0,inplace=True)#填充int类型的0