pandas对数据处理的初级基本操作

对于数据处理的基本操作使用,自己使用总结。

目录

读取csv文件

选择数据

计算数据

查看数据

分析数据相关性

合并数据

修改数据


首先导入模块库

data_train=pd.read_csv("/home/mocas/kaggle/titanic/train.csv",index_col=0) ##乘客数据导入

index_col=0代表将第一列作为index,如果不加index_col这个,则采用默认的index

存储csv文件
1.

pd.DataFrame.from_dict(df, orient='index')

选择数据

加不加[],生成的类型是不同的
type(data["A1"])
pandas.core.series.Series
type(data[["A1"]])
pandas.core.frame.DataFrame
# 对series进行筛选
(a==1).sum()
>>>2
# 对dataframe进行筛选
df[a==1].sum(0)
>>>
A     5
B    11
dtype: int64

判断是否在序列中筛选:

meta_df = meta_df[meta_df['asin'].isin( reviews_df['asin'].unique() )]
new_rate = new_rate[~new_rate['reviewerID'].isin(low_index)]  # not in,取反

计算数据

重复数值个数统计:

Series.value_counts() //统计重复重现的数据的个数。返回以数据作为key,以重复个数为value的对象。
X[c].value_counts().index[0] //最多的那个数

中值计算:

# freq_port = train_df.Embarked.dropna().mode()[0]
# mode返回出现最多的数据,可能出现多个,因此返回数组
# 填充:
# for dataset in combine:
#     dataset['E'] = dataset['E'].fillna(freq_port)

查看数据

查看键和值:

train_data = pd.read_csv('train.csv')
# 查看数据的行键index(index.values)、列键columns(columns.values)、值values
print(train_data.index)
print(train_data.index.values)

查看数据统计:

# 查看前五条和后五条数据,大致了解数据内容
print(train_data.head())
print(train_data.tail())
# 选取三条数据
data_train.sample(3)

排序:

df = DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})  
df  
#[Out]#       data1     data2 key1 key2  
#[Out]# 0  0.439801  1.582861    a  one  
#[Out]# 1 -1.388267 -0.603653    a  two  
#[Out]# 2 -0.514400 -0.826736    b  one  
#[Out]# 3 -1.487224 -0.192404    b  two  
#[Out]# 4  2.169966  0.074715    a  one
group2 = df.groupby(['key1','key2'])
自定义组内统计函数:
BRA_CLOSE_DECADE = branch2[['EID', 'B_ENDYEAR']].groupby('EID').agg(lambda df:df[df['B_ENDYEAR']>2007].count())
分组后循环:
for reviewerID, hist in reviews_df.groupby('reviewerID'):pos_list = hist['asin'].tolist()

crosstab数据:

pd.crosstab(train_data['Title'], train_data['Sex'])
# 分别以Title(Mrs,Mr等)为行,Sex(female,male)为例,计算出现频数。观察二者的对应关系。

Pivot数据:

##求相关性协方差矩阵
train_corr=train.drop('PassengerId',axis=1).corr()

删除数据

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False): 

修改数据

从数据中提取数据:

dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
dataset['Title'].replace('Ms', 'Miss')
#将一列中数据Ms替换Miss,[详解](https://jingyan.baidu.com/article/454316ab4d0e64f7a6c03a41.html)

将分类数据数值化:

def get_title(name):title_search = re.search(' ([A-Za-z]+)\.', name)# If the title exists, extract and return it.if title_search:return title_search.group(1)return ""for dataset in full_data:dataset['Title'] = dataset['Name'].apply(get_title)
from sklearn import preprocessing
def encode_features(df_train, df_test):features = ['Fare', 'Cabin', 'Age', 'Sex', 'Lname', 'NamePrefix']df_combined = pd.concat([df_train[features], df_test[features]])for feature in features:le = preprocessing.LabelEncoder()le = le.fit(df_combined[feature])df_train[feature] = le.transform(df_train[feature])df_test[feature] = le.transform(df_test[feature])return df_train, df_testdata_train, data_test = encode_features(data_train, data_test)

除去离群点:
通过画图如果发现数据中出现一些离群点,应将其除去,使用pandas布尔运算即可:

train = train[abs(train['length'])<10]

categorial无序特征哑编码one-hot:
星期为无序特征,如果该特征有三种取值:星期一、星期二、星期三,那么可用三维向量分别表示(1,0,0)(0,1,0)(0,0,1)。使用pd.get_dummies(),如果特征取值过多就应根据数据分布规律将不重要的几个取值归为一类。
 

train_test = pd.get_dummies(train_test,columns = ['SibSp','Parch','SibSp_Parch'])
train_test = pd.get_dummies(train_test,columns=["Embarked"])

去重相同行

alter.duplicated()   //返回每行是否重复的bool值,frame.duplicated(['state'])可选择指定列进行查重。
alter.duplicated().value_counts()
alter2 = alter.drop_duplicates()  //除去相同行,注意返回新数据,而不是在旧有的上面修改
df.drop_duplicates(subset='column A', keep='last') //根据特定列去重,且保留最后一个

修改index名,列键名:

df.columns = ['a', 'b', 'c', 'd', 'e']
df.columns = df.columns.str.strip('$')
df.columns = df.columns.map(lambda x:x[1:])
df.rename(columns=('$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}, inplace=True) 
df.rename(columns=lambda x:x.replace('$',''), inplace=True)
investFeature.index.rename('EID', inplace=True)

列转index、index转列:

df.set_index('date', inplace=True)
df['index'] = df.index
df.reset_index(level=0, inplace=True)
df.reset_index(level=['tick', 'obs'])
df['si_name'] = df.index.get_level_values('si_name') # where si_name is the name of the subindex.

删除index

df_load.reset_index(inplace=True)
del df_load['index']

合并列名不同的列:
先修改列名

train_cat = train[[0,1,2,3,4]]
col = train_cat.columns
for i in range(5,20,4):tem = train[[0,i,i+1,i+2,i+3]]tem.columns = coltrain_cat = pd.concat([train_cat,tem])
train_cat.head()

设置一列类型:

df[[column]] = df[[column]].astype(str)

apply返回series数据:
这样组合成的仍然是dataframe类型

def mer(x):sss = []for i,line in x.iterrows():sss.extend([line[1],line['pre']])return pd.Series(sss)
merged = sub_cat.groupby([0]).apply(mer)

根据键值和列名合并:

save.merge(merged, left_on=['a'], right_index=True)

groupby后筛选数据:
使用filter或transform

np.random.seed(130)
df=pd.DataFrame(np.random.randint(3, size=(10,2)), columns=['item_id_copy','sales_quantity'])
print (df)item_id_copy  sales_quantity
0             1               1
1             1               2
2             2               1
3             0               1
4             2               0
5             2               0
6             0               1
7             1               2
8             1               2
9             1               2df1 = df.groupby('item_id_copy').filter(lambda x: len(x["asin"].unique()) >= 4)
print (df1)item_id_copy  sales_quantity
0             1               1
1             1               2
7             1               2
8             1               2
9             1               2df1 = df[df.groupby('item_id_copy')['sales_quantity'].transform('size') >= 4]
print (df1)item_id_copy  sales_quantity
0             1               1
1             1               2
7             1               2
8             1               2
9             1               2

pandas进行one-hot编码:

import pandas as pd
df = pd.DataFrame([  ['green' , 'A'],   ['red'   , 'B'],   ['blue'  , 'A']])  
df.columns = ['color',  'class'] 
df = pd.get_dummies(df)

apply返回多列:

def myfunc1(row):C = row['A'] + 10D = row['A'] + 50return pd.Series([C, D])df[['C', 'D']] = df.apply(myfunc1 ,axis=1)
def sizes(s):    return locale.format("%.1f", s / 1024.0, grouping=True) + ' KB', \locale.format("%.1f", s / 1024.0 ** 2, grouping=True) + ' MB', \locale.format("%.1f", s / 1024.0 ** 3, grouping=True) + ' GB'
df_test['size_kb'],  df_test['size_mb'], df_test['size_gb'] = zip(*df_test['size'].apply(sizes))

按列最大最小值归一化

In [11]: df
Out[11]:a    b
A  14  103
B  90  107
C  90  110
D  96  114
E  91  114In [12]: df -= df.min()In [13]: df /= df.max() In [14]: df
Out[14]:a         b
A  0.000000  0.000000
B  0.926829  0.363636
C  0.926829  0.636364
D  1.000000  1.000000
E  0.939024  1.000000

判断一列数据是不是类型混合:

sorted(sad["size"].unique())'<' not supported between instances of 'str' and 'float'

对df的某一行的某些值进行修改:

aad.loc[aad["type"]==2,"cdate"] = aad.loc[aad["type"]==2,"adid"].map(lambda x: cdate_map[x] if x in cdate_map.keys() else -1)

groupby 后提取前多少数据,并生成pandas

orgin = reviews_map.sort_values(["reviewerID","unixReviewTime"]).groupby("reviewerID",group_keys=False)
print(orgin.get_group(1))
history = orgin.apply(lambda df: df[:-2])
ads = orgin.apply(lambda df: df[-2:])

 

 

 

 

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部