pandas数据结构 DataFrame

DataFrame

https://www.pypandas.cn/docs/getting_started/dsintro.html#dsintro

DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:

  1. 一维 ndarray、列表、字典、Series 字典
  2. 二维 numpy.ndarray
  3. 结构多维数组或记录多维数组
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值