聚沙成塔--数据分析(二)(pandas的DataFrame结构)

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!

DataFrame是一个表格类型的数据结构,想当于一个二维的数组,只不过DataFrame是按列来存储的,每一列可以有不同的数据类型,但每一列智能有一种数据类型,你可以把它想象成一个关系型数据库表,DataFrame也可是认为是由多个Series组成的,所有DataFrame取出的每一列都是一个Series数据结构。

构建一个DataFrame数据结构可以有几种方法,可以是一位的字典类型的ndarrays、list、dicts、或Series等等。

Series字典结构构建一个DataFrame结构

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}

df = pd.DataFrame(data)

print(df)

OUT:
          A         B
a  0.965723  0.072575
b -1.847803 -0.142484
c -1.104322  1.540840
d       NaN -0.843574

从结果中可以看出key作为了列索引了,index作为行标签索引,没一列都是一个Series结构,NaN作为缺省值被填充在A列最后一个值已达到数据对齐的目的。如果我们为DataFrame指定了索引值,那么将安装索引值进行排序

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}

df = pd.DataFrame(data, index=['b', 'c', 'a'])

print(df)

OUT:
          A         B
b  0.403256  2.753227
c -0.220886  1.728152
a  0.909863  0.240732

如果给出的索引在data数据列索引中没有将会以缺省值填充。DataFrame既然是二维的数据结构那么它也能指定列索引。

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}

df = pd.DataFrame(data, index=['b', 'c', 'a'], columns=['A', 'C'])

print(df)
OUT:
          A    C
b -0.914111  NaN
c -0.086271  NaN
a  0.256684  NaN

当然行列都被以索引的属性提供给了DataFrame数据类型,你可以通过df.index取到行标签索引,通过df.columns取到列标签索引。

ndarrays&lists构建DataFrame

import pandas as pd
import numpy as np

data = {'A': [1,2,3,4],
        'B': [5,6,7,8]}

df = pd.DataFrame(data)

print(df)

OUT:
   A  B
0  1  5
1  2  6
2  3  7
3  4  8

从列表字典类型构建DataFrame

import pandas as pd
import numpy as np

data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]

df = pd.DataFrame(data)

print(df)

OUT:
   a   b     c
0  1   2   NaN
1  5  10  20.0

当然你可以像上面那样去指定它的index、columns。

从元组字典类型构建DataFrame

import pandas as pd
import numpy as np

data = {('a', 'b'):{('A', 'B'):1, ('A', 'C'): 2},
        ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}}

df = pd.DataFrame(data)

print(df)

OUT:
     a   
     a  b
A B  4  1
  C  3  2

从元组字典类型构建的DataFrame数据类型是一个多索引的数据结构类型,不过思想都是一样的key作为列索引,值里面的key作为行索引。关于多个索引将会在后面介绍。

列的选取、增加、删除、筛选

  • 选取一列
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}

df = pd.DataFrame(data)

print(df['A'])

OUT:
a    0.518881
b    0.928695
c   -0.843319
Name: A, dtype: float64

当然你也可以选取多列,多列的选取可以像下面这么做

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c']),
        'C': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

print(df[['A', 'C']])
OUT:
          A         C
a  0.940624  0.035024
b  0.318521  0.222687
c  0.180449  0.433753

你还可以使用iloc按行位置选取、loc按行标签索引选取

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c']),
        'C': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

print(df)

# 按行位置索引
print('取行索引为1的一行数据:\n%s' % df.iloc[1])
print('取行索引为1,2的两行数据:\n%s' % df.iloc[1:])

# 按行标签索引
print('取行标签索引为b的一行数据:\n%s' % df.loc['b'])
print('取行标签索引为a到c的三行数据:\n%s' % df.loc['a': 'c'])
OUT:
          A         B         C
a  0.284014  1.053296  0.529340
b -1.443032  1.114718  0.449405
c -0.087776  1.718656 -0.490695
取行索引为1的一行数据:
A   -1.443032
B    1.114718
C    0.449405
Name: b, dtype: float64
取行索引为1,2的两行数据:
          A         B         C
b -1.443032  1.114718  0.449405
c -0.087776  1.718656 -0.490695
取行标签索引为b的一行数据:
A   -1.443032
B    1.114718
C    0.449405
Name: b, dtype: float64
取行标签索引为a到c的三行数据:
          A         B         C
a  0.284014  1.053296  0.529340
b -1.443032  1.114718  0.449405
c -0.087776  1.718656 -0.490695
  • 增加一列
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

df['C'] = df['A'] * df['B']

print(df)

OUT:
          A         B         C
a  1.785824  0.823041  1.469807
b  0.252471 -0.756140 -0.190903
c  0.111340  1.352880  0.150629
  • 删除一列
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

df['C'] = df['A'] * df['B']

del df['A']

print(df)

OUT:
          B         C
a  0.172547 -0.128743
b -0.305665 -0.393696
c  2.006161 -2.865414
  • 筛选A列大于0的数据
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

df['C'] = df['A'] * df['B']
print(df)
print(df[df.A > 0])

OUT:
          A         B         C
a -1.166174 -0.651518  0.759784
b  0.889244 -0.199157 -0.177100
c -0.795640 -0.018516  0.014732
          A         B       C
b  0.889244 -0.199157 -0.1771

时间序列

import pandas as pd
import numpy as np

index = pd.date_range('01/01/2018', periods=8)


df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))

print(df)
OUT:
                   A         B         C
2018-01-01 -0.001183  0.749614  0.470705
2018-01-02 -0.900087 -3.067426 -1.840941
2018-01-03 -0.938453 -0.053678 -1.187395
2018-01-04  1.149277  0.266508  0.730095
2018-01-05  0.680196 -1.148432  1.066883
2018-01-06 -0.475393  0.493522 -1.730322
2018-01-07  0.554609 -1.553775  0.425781
2018-01-08  1.978791 -0.503719 -0.343008

okay, DataFrame的介绍就到这里,希望你能跟我一起去学习,去进步


欢迎关注我:「爱做饭的老谢」,老谢一直在努力...

你可能感兴趣的:(聚沙成塔--数据分析(二)(pandas的DataFrame结构))