Pandas
2种类型:series, dataframe
series
>>> a = pd.Series([1,2,3,4])
>>> a
0 1
1 2
2 3
3 4
dtype: int64
>>> a.index
RangeIndex(start=0, stop=4, step=1)
索引可以定义为其他的:
>>> s = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd'])
>>> s
a 1
b 2
c 3
d 4 dtype: int64
数字索引支持slice.
字母索引:
>>> s[['a', 'd']]
a 1
d 4
dtype: int64
Series的第一个参数接受dict,list
转变为字符串
>>> a.astype('str')
0 1
1 2
2 3
3 4
dtype: object #object表示字符串。⚠️a.astype产生的是新的对象。
⚠️Series内的数据类型必须是一样的。
dataframe
series是一维的结构,dataframe是二维的结构。
>>> d = { 'name': ['qinlu', 'lui', 'qinqin'], ... "sex": ['male', 'female'], ... 'age': [12,34,12]} >>> pd.DataFrame(d) ... ValueError: arrays must all be same length ... # 因为sex只有2个值。 >>> d["sex"].append('none') >>> pd.DataFrame(d) name sex age 0 qinlu male 12 1 lui female 34 2 qinqin none 12 >>>
pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
定义columns, 列标签,行标签使用index。
>>> pd.DataFrame([[1,2,3,4], [3,4,5,6]], columns=list('abcd')) a b c d 0 1 2 3 4 1 3 4 5 6
info()函数
查看df的详细信息:
>>> df = pd.DataFrame(d) >>> df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 3 entries, 0 to 2 Data columns (total 3 columns): name 3 non-null object sex 3 non-null object age 3 non-null int64 dtypes: int64(1), object(2) memory usage: 200.0+ bytes
切片:
获得一列的数据。
>>> df['age'] 0 12 1 34 2 12 Name: age, dtype: int64 >>> type(df['age']) <class 'pandas.core.series.Series'> #⚠️单独对列切片,返回一个Series类型。即从二维到一维。
获得一行的数据:
使用方法: .loc或.iloc
>>> df.loc[0] name qinlu sex male age 12 Name: 0, dtype: object
>>> type(df.iloc[0]) <class 'pandas.core.series.Series'> #也是返回Series类型。
获得多列:
>>> df[ ['age', 'name'] ] age name 0 12 qinlu 1 34 lui 2 12 qinqin
- 外层[],代表切片/索引
- 内层[], 代表列表。
获得多行:.loc
>>> df.loc[0:2]
name sex age
0 qinlu male 12
1 lui female 34
2 qinqin none 12
⚠️,得到了三行,即索引0,1,2
如果使用df[0:2],只能得到0,1两行索引。
搜索
>>> df.age == 34 0 False 1 True 2 False Name: age, dtype: bool #搜索age为34的行记录,返回的是一个bool列表。每个bool值对应一行。
>>> df[ df.age == 34 ] name sex age 1 lui female 34
>>> df[ [False, True, False]] name sex age 1 lui female 34
⚠️ 后两个表达式其实是等价的.
还可以使用比较判断符号> , < , 还可以使用~反转符号。
>>> df[~(df.age > 15)]
name sex age
0 qinlu male 12
2 qinqin none 12
还可以使用&, |
>>> (df.age == 12) & (df.name == 'qinlu') 0 True 1 False 2 False dtype: bool >>> (df.age == 12) | (df.name == 'qinlu') 0 True 1 False 2 True dtype: bool
可以使用query
>>> df.query("(age == 34) | (sex == 'male')") name sex age 0 qinlu male 12 1 lui female 34
除了使用切片,还可以用属性的方式获得列数据
下面2种结果等价的。
>>> df.age 0 12 1 34 2 12 Name: age, dtype: int64 >>> df["age"] 0 12 1 34 2 12 Name: age, dtype: int64
可以使用运算符号对整数类的列进行运算
>>> df.age = df.age + 100
>>> df
name sex age
0 qinlu male 112
1 lui female 134
2 qinqin none 112
⚠️DataFrame也有对行的增append,删除操作,但不建议使用,因为运算效率低。
df.ioc[] 和.loc[]的区别
iloc根据行所在的具体位置,来读取行记录。
>>> df name sex age 0 qinlu male 12 1 lui female 34 2 qinqin none 12 >>> df.iloc[1] name lui sex female age 34 Name: 1, dtype: object
loc根据index索引/标签,来读取行记录。
>>> df.index = list("abc") >>> df name sex age a qinlu male 12 b lui female 34 c qinqin none 12 >>> df.loc['b'] name lui sex female age 34 Name: b, dtype: object
.loc的参数结构
第一个参数是行标签,第二个参数是列标签
例子:
>>> df.iloc[1:2, 1]
b female
Name: sex, dtype: object
显示方式有两种:
- a scalar integer df.iloc[0]
- a list integer df.iloc[[0]]
>>> df.iloc[0] name qinlu sex male age 12 Name: a, dtype: object >>> df.iloc[[0]] name sex age a qinlu male 12
赋值:使用.loc进行行定位,列定位,然后修改对应的值
>>> df name sex age a qinlu male 11 b lui female 34 c qinqin none 11 >>> df.loc[df.age == 11, 'age'] = 22 >>> df name sex age a qinlu male 22 b lui female 34 c qinqin none 22
下面的视频是7.104 read_csv