The Series Data Structure
np.nan 类似于 None,但不相等,也不相等于自己,要用特定的函数才能检测出来:
>>> import numpy as np
>>> np.nan == None
False
>>> np.nan == np.nan
False
>>> np.isnan(np.nan) # `df.isnull` in DataFrame
True
建立一个 series,可以手动输入 index,不然就是 1、2、3(直接导入 list),如果 index 在 dictionary 里没有的话,建立 series 以后它对应的值就是 NaN:
>>> s = pd.Series(['Tiger', 'Bear', 'Moose'], index=['India', 'America', 'Canada'])
>>> s
India Tiger
America Bear
Canada Moose
dtype: object
>>> sports = {'Archery': 'Bhutan',
'Golf': 'Scotland',
'Sumo': 'Japan',
'Taekwondo': 'South Korea'}
>>> s = pd.Series(sports, index=['Golf', 'Sumo', 'Hockey'])
>>> s
Golf Scotland
Sumo Japan
Hockey NaN
dtype: object
Querying a Series
-
用 numpy 里的随机数生成 series 使用代码
s = pd.Series(np.random.randint(0,1000,10000))
,只显示前几个用代码s.head()
。 -
按 index 序号搜索的函数是
.iloc[0]
,按 index 名称搜索的函数是.loc['A']
。可以直接用s.loc['A'] = 'a'
来给 series 增加一个值。 -
s=s+2
,给 series 的每一个值都 +2,相当于s = pd.Series(np.random.randint(0,1000,10000))
for label, value in s.iteritems():
s.loc[label]= value+2 -
append 一个原来的 series 再赋值给一个新的变量,并不改变原来的 series,而是重新创造了一个 series。
original_sports = pd.Series({'Archery': 'Bhutan',
'Golf': 'Scotland',
'Sumo': 'Japan',
'Taekwondo': 'South Korea'})
cricket_loving_countries = pd.Series(['Australia',
'Barbados',
'Pakistan',
'England'],
index=['Cricket',
'Cricket',
'Cricket',
'Cricket'])
all_countries = original_sports.append(cricket_loving_countries)
output:
Archery Bhutan
Golf Scotland
Sumo Japan
Taekwondo South Korea
dtype: object
The DataFrame Data Structure
import pandas as pd
purchase_1 = pd.Series({'Name': 'Chris',
'Item Purchased': 'Dog Food',
'Cost': 22.50})
purchase_2 = pd.Series({'Name': 'Kevyn',
'Item Purchased': 'Kitty Litter',
'Cost': 2.50})
purchase_3 = pd.Series({'Name': 'Vinod',
'Item Purchased': 'Bird Seed',
'Cost': 5.00})
df = pd.DataFrame([purchase_1, purchase_2, purchase_3], index=['Store 1', 'Store 1', 'Store 2'])
df
output:
Cost Item Purchased Name
Store 1 22.5 Dog Food Chris
Store 1 2.5 Kitty Litter Kevyn
Store 2 5.0 Bird Seed Vinod
搜索语句范例:
df.loc['Store 2']
df.loc['Store 1', 'Cost']
df.loc['Store 1']['Cost'] # 用上面的更高效
df.T #转置
df.T.loc['Cost'] # 搜索行坐标需要加 .loc[]
df['Cost'] # 搜索列坐标不需要加 .loc[]
df.loc[:,['Name', 'Cost']]
- 删除行/列:
drop
语句。df.drop('Store 1')
并不删除 Store 1 那一行,而是返回一个 copy。想要有一个删除的 DataFrame,使用语句copy_df = df.copy()
和copy_df = copy_df.drop('Store 1')
。drop
语句有个参数 axis,默认是 0,表示 row axis;如果 axis = 1,就表示 column。 - 删除列:
del
语句。例如del copy_df['Name']
可以删掉 Name 那一列。 - 添加行:
df.loc['Location'] = None
- 添加列:
df['Location'] = None
DataFrame Indexing and Loading
- 读取 csv 文件:
df = pd.read_csv('olympics.csv')
;如果让行和列的第一排不是 0、1、2… 的数字,就要用df = pd.read_csv('olympics.csv', index_col = 0, skiprows=1)
,说明第 0 列当作 index,并且直接从第一行开始。 -
df.columns
可以显示第一排所有的 column 名称,改名使用函数DataFrame.rename(index=None, columns=None, kwargs)
,例如df.rename(columns={col:'Gold'}, inplace=True)
。Inplace: whether to return a new DataFrame. If True then value of copy is ignored. Default = False.
Querying a DataFrame
- Boolean Mask: 它和 DataFrame 重叠,可以把 False 的部分变成 NaN 或者直接删去。格式例如:
df['Gold'] > 0
-
only_gold = df.where(df['Gold'] > 0)
在 where 函数里加 Boolean Mask 可以将不符合的变成 NaN,再用.dropna()
函数去除掉 NaN 值,效果与only_gold = df[df['Gold'] > 0]
相同,在 df (不带 .where)里放入 Boolean Mask。
Indexing DataFrames
- 把原来的 index (行)变成列标:
df['new_name'] = df.index
- 设置新的 index:
df = df.set_index('A')
,这个 A 要是原来列名里有的,或者df = df.set_index(['A', 'B'])
- 重置 index,变成 0、1、2…:
df = df.reset_index()
- 选出一列里不重复的元素
df['column_name'].unique()
- 给 index 重新命名:
df.index.names = ['Location', 'Name']
,显然这里有两个 index。 - 往 DataFrames 里加新元素:
df = df.append(pd.Series(data={'Cost': 3.00, 'Item Purchased': 'Kitty Food'}, name=('Store 2', 'Kevyn')))
,name 里的两个是 index 的值,等于是根据这个 index(name) 的值往里加了个 series。 - 对 index 里的值排序:
.sort_index()
。
Missing Values
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
method : (’backfill', 'bfill', 'pad', 'ffill', None), default None
Method to use for filling holes in reindexed Series
pad / ffill: propagate last valid observation forward to next valid
backfill / bfill: use NEXT valid observation to fill gap
axis : (0, 1, 'index', 'columns’)
Other querying
-
df['column_name'].idxmax()
输出某一个 column 最大值所在的 index 的名字。df['column_name'].argmax()
是它的 Series 版本。 -
df['column_name_C'] = df['column_name_A'] + df['column_name_B']
通过这个代码可以给 DataFrame 增加一列。 -
df.max(axis = 0)
用来求每一列的最大值,返回值是一行,所以 axis = 0;同理,df.max(axis = 1)
用来求每一行的最大值。 -
df[‘column_name'].str.startswith('abc'))
用来判断某一列里的字符串变量是不是以 ‘abc’ 开头,返回一个 boolean mask。 -
df.apply((func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
以及GroupBy.apply(func, *args, **kwargs)
,用来进行整体的函数处理。 -
Series.apply:
Series.apply(func, convert_dtype=True, args=(), **kwds)
-
Groupby.apply:
GroupBy.apply(func, *args, **kwargs)
-
DataFrame.apply:
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
网友评论