DataFrame
https://www.pypandas.cn/docs/getting_started/dsintro.html#dsintro
DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:
- 一维 ndarray、列表、字典、Series 字典
- 二维 numpy.ndarray
- 结构多维数组或记录多维数组
Series
DataFrame
除了数据,还可以有选择地传递 index(行标签)和 columns(列标签)参数。传递了索引或列,就可以确保生成的 DataFrame 里包含索引或列。Series 字典加上指定索引时,会丢弃与传递的索引不匹配的所有数据。
用 Series 字典或字典生成 DataFrame
amount = {'booking':pd.Series([5000,2000,3000],index = ['Amy','Peter','Joe']),
'billing':pd.Series([3025,1555,4500,2351],index = ['Amy','Peter','Joe','PT'] )}
pd.DataFrame(amount)
Out[4]:
booking billing
Amy 5000.0 3025
Joe 3000.0 4500
PT NaN 2351
Peter 2000.0 1555
PS: 创建一个列可以用.split()
a = 'a b c d e f'.split()
print(a)
['a', 'b', 'c', 'd', 'e', 'f']
type(a)
Out[72]: list
索引其中的行和列:
b = pd.DataFrame(a, index = ['Amy','PT'], columns=['booking'])
Out[8]:
booking
Amy 5000.0
PT NaN
用多维数组字典、列表字典生成 DataFrame
多维数组的长度必须相同。如果传递了索引参数,index 的长度必须与数组一致。如果没有传递索引参数,生成的结果是 range(n),n 为数组长度。
上面用pd.Series 的时候,index 如果不一致,会把两列index 合并, 没有的值自动补充为NaN.
这里用多维数组字典的话,index 长度必须要一致!!
a = {'booking':[5000,2000,3000],'billing':[3025,1555,4500,2351]}
b = pd.DataFrame(a,index = ['Amy','Peter','Joe','PT'])
ValueError: Shape of passed values is (2, 3), indices imply (2, 4)
更新index一致后:
a = {'booking':[5000,2000,3000,np.NaN],'billing':[3025,1555,4500,2351]}
b = pd.DataFrame(a,index = ['Amy','Peter','Joe','PT'])
Out[14]:
booking billing
Amy 5000.0 3025
Peter 2000.0 1555
Joe 3000.0 4500
PT NaN 2351
列换一下顺序
b1 = pd.DataFrame(b,columns=['billing','booking'])
Out[6]:
billing booking
a 5 10
b 10 20
c 15 30
d 13 10
上边给出里可以通过list、dict来创建Series等方法,但常用的方法还是list来提供数据和index、label比较好,原因是字典不能有重复的key而列表是允许有重复的。
http://liao.cpython.org/pandas02/
i = ["a", "c", "d", "a"]
v = [2, 4, 5, 7]
t = pd.Series(v, index=i, name = "col_name")
Series构造函数的name参数是给这列数据指定字段名。从结果可以看出t有两个名为’a’的label,值分别为2和7。
一般情况下在pandas里使用Series和dataframe都用字符串作为index,而在学习Series时为了方便才用整形0~len()-1作为index的。所以一般要为每个Series、dataframe分配一个字符串型的index更为常用、常见。
print "t['a']\n", t["a"]
a 2
a 7
t[0] 2
t[3] 7
以上例子在创建Series尽管指定了index参数,实际pandas还是有隐藏的index位置信息的。所以Series有两套描述某条数据的手段:位置和标签。
DataFrame 里的缺失值用 np.nan 表示
提取
b1['booking']
Out[7]:
a 10
b 20
c 30
d 10
Name: booking, dtype: int64
添加
b1['backlog'] = b1['booking'] - b1['billing']
Out[9]:
billing booking backlog
a 5 10 5
b 10 20 10
c 15 30 15
d 13 10 -3
b1['check'] = b1['backlog'] < 0
Out[11]:
billing booking backlog check
a 5 10 5 False
b 10 20 10 False
c 15 30 15 False
d 13 10 -3 True
删除 del[ ]
del b1['check']
Out[13]:
billing booking backlog
a 5 10 5
b 10 20 10
c 15 30 15
d 13 10 -3
删除pop( ),注意这里是(),不是[ ]
b
booking billing
a 10 5
b 20 10
c 30 15
d 10 13
b.pop('booking')
Out[20]:
a 10
b 20
c 30
d 10
Name: booking, dtype: int64
标量值以广播的方式填充列:
b
Out[26]:
booking billing backlog
a 10 5 5
b 20 10 10
c 30 15 15
d 10 13 -3
b['K'] = 'KFG'
booking billing backlog K
a 10 5 5 KFG
b 20 10 10 KFG
c 30 15 15 KFG
d 10 13 -3 KFG
插入与 DataFrame 索引不同的 Series 时,以 DataFrame 的索引为准,不在DataFrame里面的索引会被删掉的:
b['opp'] = pd.Series([50,40,30,40], index = list('cdef'))
Out[31]:
booking billing backlog K opp
a 10 5 5 KFG NaN
b 20 10 10 KFG NaN
c 30 15 15 KFG 50.0
d 10 13 -3 KFG 40.0
insert 函数可以指定插入列的位置:
insert(loc, column, value, allow_duplicates=False)
Raises a ValueError if column
is already contained in the DataFrame,unless allow_duplicates
is set to True.
如果要添加重复列名,需要把allow_duplicates = True
b.insert(4,'insert',['insert'] * 4)
booking billing backlog K insert opp
a 10 5 5 KFG insert NaN
b 20 10 10 KFG insert NaN
c 30 15 15 KFG insert 50.0
d 10 13 -3 KFG insert 40.0
[ ] 的数据类型是Series
type(mmr['Sales Order'])
Out[6]: pandas.core.series.Series
[[ ]] 的数据类型是DataFrame
type(mmr[['Sales Order']])
pandas.core.frame.DataFrame