刚刚使用Python学习进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~
Pandas是一个第三方库,主要功能是提供了 DataFrame这个数据结构,它可以让我们直接在数据集上使用关系模型,比如分组(group by),聚合(agg)或者联合(join)等操作。它是基于Numpy的数据分析库。本文将分别介绍Series和DataFrame两种数据结构的基本操作。
1. 什么是Series和DataFrame
Series是Pandas提供的一种基础数据类型,也是一个序列类型,它的大部分操作与Numpy的ndarray操作类型;同时也是一个索引类型,可以像Python中的字典一样操作。但是和ndarray一样,是只能包含同一种类型元素的序列,与Python中的 list和字典不一样。每个Series对象都有index和values组成:index是从Numpy继承的index对象,保存标签信息;values保存值(如上所述,index也可以被看成标签 key)
DataFrame是一个将数据存储为行和列的对象。可以将DataFrame视为电子表格或SQL表格。它的每列都有一个名称,是一个字符串;每行都有一个索引,是一个整数。DataFrames可以包含许多不同的数据类型:字符串,整数,浮点数,元组等。
2. 创建
- 创建Series
(1)直接创建:pd.Series([1,0.3,np.nan])
(2)从Python的list中创建:pd.Series(list([1,0.3,np.nan]))
(3)从Numpy的ndarray中创建:pd.Series(np.array([1,0.3,np.nan]))
我们能看到打印Series的时候,第一列有一个序列号,这就是Series的索引部分。如果我们不自定义索引,系统会生成自增的键,如图示。
(4)自定义索引:pd.Series([1,0.3,np.nan] , index = ["a","b","c"])
(5)从Python的字典创建:pd.Series({"a":1 , "b":0.3 , "c":np.nan})
直接定义了索引
- 创建DataFrame
(1)使用dictionary添加Dataframe
:key为Dataframe中的列名;value为Dataframe中列名下对应的列数据(要求value个数一致)
df1 = pd.DataFrame({
'name': ['John Smith', 'Jane Doe', 'Joe Schmo'],
'address': ['123 Main St.', '456 Maple Ave.', '789 Broadway'],
'age': [34, 28, 51]
})
(2)使用 list of lists 添加Dataframe
:每个列表代表一行数据;可以使用关键字columns定义列名(如果不定义会和 index一样,系统自动生成一个自增序列)
df2 = pd.DataFrame([
['John Smith', '123 Main St.', 34],
['Jane Doe', '456 Maple Ave.', 28],
['Joe Schmo', '789 Broadway', 51]
],
columns=['name', 'address', 'age'])
(3)从Numpy的ndarray中创建:pd.DataFrame(np.random.randn(5,4), columns=list("aasd"))
(4)从csv文件加载数据:pd.read_csv(" dir ", index_col=n)
通常使用是在对dataframe操作之后,数据中有一个列没有实际的效用,生成出来的0123456的序列,即列Unnamed:0,如果这个时候不使用它作为index就会出现:
index_col参数的含义是:将index=n的列作为索引
data=pd.read_csv("/Users/MachineLearning/03_Preprocessing:Dimensionality_reduction/Narrativedata.csv",index_col=0)
3. 查看数据
以下列数据为例:
data = pd.DataFrame(np.random.randn(6,4),columns=list('ABCD'))
- 查看数据维度信息:
data.shape
- 查看每列数据的统计信息:
data.info()
- 查看每列数据的数据类型:
data.dtypes
- 输出行索引:
data.index
- 输出列索引:
data.columns
- 查看数据:
data
或data.head(n)
- 查看数据的值:
data.values
- 选择行数据:
(1)选择一行数据:data.loc[index]
或data.iloc[index]
(2)选择多行数据:
a. data.loc[2:4]
b. data.iloc[2:4]
或data[2:4]
.loc[k]是读取dataframe中index为k的那一行
.iloc[k]是读取dataframe中的第k行
- 选择列数据:
(1)选择某一列:data.B
或data["B"]
或data.loc[ :, "B"]
或data.iloc[ :, 1]
(2)选择多列:data[['A','B']]
或data.loc[ :, ["A","B"]]
或data.iloc[:,[ 0,1]]
或data.iloc[:,[ 0:2]]
- 选择满足条件的数据:
(1)逻辑判断所有元素:data[data>0]
(2)使用列逻辑判断,展示将满足条件的所有行数据:data[data.A>0]
(3)满足某列中值为x的所有行数据:data[data.target.isin(["1","0"])]
** (以“赋值”操作之后的数据为例)
4. 赋值
(1)复制数据:data.cope()
(2)给某个元素赋值:data.iat[0,0] = 100
(3)给某列中的某几个元素赋值:data.loc[data.index[1:3],'C'] = 200
(4)新增一列:data["target"]=np.random.randint(0,3,size=6)
(5)给某列赋值:data.B=200
或data["B"]=200
或data.loc[:,["B","D"]]=150
或data.iloc[:,[1,3]]=150
(6)给某列的索引名重新赋值:data.rename(columns={'target':'TAG'})
(7)给全部列的索引重命名:data.columns=["a","b","c","d","e","f"]
(8)给全部行索引重命名:data.index=["a","b","c","d","e","f"]
(9)新增一行:data.append(data_series, ignore_index = True)
(10)为NaN元素赋值:data.fillna(n)
5. 删除
- 删除有空值的行或列:
data.dropna(axis=0, inplace=False)
- 删除某行或某列:
data.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
使用数据:
data = pd.DataFrame(np.random.randn(6,4),columns=list('ABCD'))
(1)删除列:使用label+axis参数或者直接使用columns参数
data.drop(["A","C"],axis=1)
# or
data.drop(columns=["A","C"])
(2)删除行:直接使用index参数
data.drop(index=[2,5])
6.常用函数
常用接口 | 参数 | 返回值 | 说明 | |
---|---|---|---|---|
1 | data.mean() | axis=0/1默认值为0 | Series | 求列平均值 |
2 | data.std() | axis=0/1默认值为0 | Series | 求每列的标准差 |
3 | data.median() | axis=0/1默认值为0 | Series | 求每列的中位数 |
4 | data.min() | axis=0/1默认值为0 | Series | 求每列的最小值 |
5 | data.max() | axis=0/1默认值为0 | Series | 求每列的最大值 |
6 | data.sum() | axis=0/1默认值为0 | DataFrame/Series | 对每列求和 |
7 | data.cumsum() | axis=0/1默认值为0 | DataFrame/Series | 对每行进行累加 |
8 | data.nunique() | axis=0/1默认值为0 | int/Series | 统计Series中不同值的个数/统计DataFrame中每列中几个不同值 |
9 | data_series.mode() | Series | 常用在返回对Series中出现最多的元素 | |
10 | data_series.unique() | ndarray | 只能用在统计Series中存在的不重复元素 | |
11 | data_series.value_counts() | Series | 只能用在统计Series中每个元素出现的次数 | |
12 | pd.isnull(data) | 要被判断的Series或者Dataframe | bool类型的Series/DataFrame | 判断Series或者Dataframe中每个元素是否为NaN |