pandas Series/DataFrame 与 字典

稍微了解numpy后,再来看pandas的概念较为清爽些

import pandas as pd
seri = pd.Series([1,2,4])
seri
0    1
1    2
2    4
dtype: int64
seri.index
RangeIndex(start=0, stop=3, step=1)
seri.values
array([1, 2, 4], dtype=int64)
seri.dtype
dtype('int64')

再看一个不同的情况

seri2 = pd.Series([1,2,'日本','日本',2])
seri2
0     1
1     2
2    日本
3    日本
4     2
dtype: object
seri2.value_counts()
2     2
日本    2
1     1
dtype: int64

不同数据类型不能sort,当然实际情况下,几乎不会有一个Series的元素不同数据类型

seri2.sort_values()
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

c:\python\lib\site-packages\pandas\core\series.py in _try_kind_sort(arr)
   2786                 # if kind==mergesort, it can fail for object dtype
-> 2787                 return arr.argsort(kind=kind)
   2788             except TypeError:


TypeError: '<' not supported between instances of 'str' and 'int'


During handling of the above exception, another exception occurred:


TypeError                                 Traceback (most recent call last)

 in 
----> 1 seri2.sort_values()


c:\python\lib\site-packages\pandas\core\series.py in sort_values(self, axis, ascending, inplace, kind, na_position)
   2799         idx = ibase.default_index(len(self))
   2800 
-> 2801         argsorted = _try_kind_sort(arr[good])
   2802 
   2803         if is_list_like(ascending):


c:\python\lib\site-packages\pandas\core\series.py in _try_kind_sort(arr)
   2789                 # stable sort not available for object dtype
   2790                 # uses the argsort default quicksort
-> 2791                 return arr.argsort(kind='quicksort')
   2792 
   2793         arr = self._values


TypeError: '<' not supported between instances of 'str' and 'int'

也可以通过字典来生成Series,字典键值将是Series的index

seri3 = pd.Series({'张三':85,'李四':34,'王五':88})
seri3
张三    85
李四    34
王五    88
dtype: int64
seri3.values
array([85, 34, 88], dtype=int64)
seri3.index
Index(['张三', '李四', '王五'], dtype='object')
seri3.sort_values()
李四    34
张三    85
王五    88
dtype: int64

也可以这样生成

seri4 = pd.Series([45,56,78],index=['张','李','钱'])
seri4
张    45
李    56
钱    78
dtype: int64

这是一种创建方式,但是通常我们都是直接从dataframe里面取一个series,而非直接创建

下面看看怎么访问

seri4['张']
45
seri4[seri4 > 60]
钱    78
dtype: int64

从这里我们发现Series是dict like object,可以相互转化

info_dict = dict(seri4)
info_dict
{'张': 45, '李': 56, '钱': 78}

还可以给Series更换index,给index起名字

seri4
张    45
李    56
钱    78
dtype: int64
seri5 = pd.Series(seri4,index=['z','li','qian'])
seri5
z      NaN
li     NaN
qian   NaN
dtype: float64
seri6 = pd.Series(seri4,index=['张','钱','周'])
seri6
张    45.0
钱    78.0
周     NaN
dtype: float64
seri6['周'] = 95
seri6
张    45.0
钱    78.0
周    95.0
dtype: float64

可以通过指定index来挑拣出新的series元素——很像dict,但比dict强大

lst = list(seri6)
lst
[45.0, 78.0, 95.0]

Series也可以转换成list,——seri6.values是array的缘故

接下来我们改改index的名字

seri6.index.name = '姓名'
seri6
姓名
张    45.0
钱    78.0
周    95.0
dtype: float64
seri6.name = '成绩'
seri6
姓名
张    45.0
钱    78.0
周    95.0
Name: 成绩, dtype: float64

接下来我们预见一下dataframe的特性

df = pd.DataFrame({'姓名':['张三','李四','钱舒同','杨超越'],
                   '成绩':[76,   73,   88,   65],
                   '性别':['男','男','女','女'],
                  })
df
姓名 成绩 性别
0 张三 76
1 李四 73
2 钱舒同 88
3 杨超越 65
df1 = pd.DataFrame(df,columns=['姓名','性别'])
df1
姓名 性别
0 张三
1 李四
2 钱舒同
3 杨超越

这种从series新建series,从dataframe新建dataframe的方式真的很handy

df1.index.name = '序号'
df1
姓名 性别
序号
0 张三
1 李四
2 钱舒同
3 杨超越

你可能感兴趣的:(Python,pandas)