數據科學包——pandas基礎(創建對象、查看和選擇數據)

一、創建數據集對象

1.Pandas數據結構Series

Series 對象可以理解爲一維數組

1.1 普通初始化

s = pd.Series([1, 3, 5, np.nan, 6, 8])
s
>>>
0     1
1     3
2     5
3   NaN
4     6
5     8
dtype: float64

1.2 指定index

pandas會默認用0到n-1來作爲Series的index,但是我們也可以自己指定index。index我們可以把它理解爲dict裏面的key

s = pd.Series([7, 'Beijing', 2.17, -12344, 'Happy Birthday!'],
             index=['A', 'B', 'C', 'D', 'E'])
s
>>>
A                  7
B            Beijing
C               2.17
D             -12344
E    Happy Birthday!
dtype: object

1.3 利用字典構造Series

還可以用dictionary來構造一個Series,因爲Series本來就是key value pairs。

cities = {'Beijing': 55000, 'Shanghai': 60000, 'Shenzhen': 50000, 'Hangzhou': 20000, 'Guangzhou': 25000, 'Suzhou': None}
apts = pd.Series(cities, name="price")
apts
>>>
Beijing      55000.0
Shanghai     60000.0
Shenzhen     50000.0
Hangzhou     20000.0
Guangzhou    25000.0
Suzhou           NaN
Name: price, dtype: float64

1.4 numpy ndarray構建一個Series

s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
>>>
a   -1.480891
b    0.315682
c    0.109896
d   -0.963698
e    0.834620
dtype: float64

2.Pandas數據結構DataFrame

一個Dataframe就是一張表格,Series表示的是一維數組,Dataframe則是一個二維數組,可以類比成一張excel的spreadsheet。也可以把Dataframe當做一組Series的集合。

2.1 普通創建

  • 設置行標籤和列標籤
dates = pd.date_range('20160301', periods=6)
dates
>>>
DatetimeIndex(['2016-03-01', '2016-03-02', '2016-03-03', '2016-03-04',
               '2016-03-05', '2016-03-06'],
              dtype='datetime64[ns]', freq='D')

DataFrame 對象可以理解爲二維數組,可以指定索引格式。

df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
>>>
                   A         B         C         D
2016-03-01 -0.779271 -0.156312 -1.567857 -1.173683
2016-03-02  0.621355  0.403143 -0.233806  0.090319
2016-03-03 -0.441081 -0.231066 -0.395750 -0.566691
2016-03-04 -0.220860  1.570879 -0.532439 -0.574232
2016-03-05 -0.301826 -0.268013  0.176482 -0.932393
2016-03-06  0.013857  1.134069  0.992023  0.179226
  • 查看數值
df.values

2.2 使用字典來創建

使用字典來創建:key 爲 DataFrame 的列;value 爲對應列下的值

df = pd.DataFrame({
                  'A': 1,
                  'B': pd.Timestamp('20160301'),
                  'C': range(4),
                  'D': np.arange(5, 9),
                  'E': 'text',
                  'F': ['AA', 'BB', 'CC', 'DD']})
df
>>>
   A          B  C  D     E   F
0  1 2016-03-01  0  5  text  AA
1  1 2016-03-01  1  6  text  BB
2  1 2016-03-01  2  7  text  CC
3  1 2016-03-01  3  8  text  DD
  • 查看格式
df.dtypes
  • 查看某列數據
df.A
>>>
0    1
1    1
2    1
3    1
Name: A, dtype: int64

二、查看數據

  • 創建數據集
n_rows = 6
dates = pd.date_range('20160301', periods=n_rows)
df = pd.DataFrame(np.random.randn(n_rows, 4), index=dates, columns=list('ABCD'))
df
>>>
                   A         B         C         D
2016-03-01  0.819810 -0.152730 -1.177506  0.301507
2016-03-02 -2.243868  0.027009 -1.294775 -0.080856
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302
2016-03-04 -0.373900 -1.076556 -0.193431  0.771121
2016-03-05 -0.461388 -0.404523  1.015933 -2.771721
2016-03-06  0.125354  1.777238  0.350636 -1.049762
  • 查看
df.shape #查看數據結構 >>>(6, 4)
df.head(3) #查看前三條數據
df.tail(2) #查看後兩條數據
df.index #查看行標籤
df.columns #查看列標籤
df.values #只查看數據
df.describe() #查看數據的個數、平均值、最大值等信息
df.T #矩陣的轉置 df.T.shape >>> (4, 6)
df.sort_index(axis=1, ascending=False) #按照列標籤降序,ascending=True爲升序;
axis=0,按照行標籤降序

axis=1是跨行,axis=0是跨列
image

df.sort_values(by='C') #根據C列數據排序,默認升序

三、數據選擇

df['A'] #選擇A列數據
df[2:4] #選擇第三行到第四行的數據,和python切片的規則一樣
df['20160302':'20160305'] #依據時間選擇數據

1.通過標籤選擇

df.loc['20160301']
>>>
A    1.313419
B    0.826457
C   -1.574146
D    0.525008
Name: 2016-03-01 00:00:00, dtype: float64
type(df.loc['20160301'])
>>>
pandas.core.series.Series
df.loc[:, ['A', 'B']] #選擇A、B列的所有數據
df.loc['20160301':'20160305', ['A', 'B']] #選擇20160301--20160305之間,A、B兩列的數據
df.loc['2016-03-01', 'A'] #2016-03-01這天A的數據
df.at[pd.Timestamp('2016-03-01'), 'A']
#效果同上
# df.at['2016-03-01', 'A'] will raise error

2.通過位置選擇

df.iloc[1] #選擇第二行的所有數據
df.iloc[2:5, 0:2] #選擇第三行到五行,第一列到第二列的數據
df.iloc[1:5, :] #選擇第二行到第五行的所有數據
df.iloc[1, 1] #選擇第二行第二列的數據
df.iat[1, 1] #選擇第二行第二列的數據

3.布爾索引

df[df > 0] #選擇所有大於0的數據
df[df.A < 0] #選擇A列數據中小於0的數據
>>>
                   A         B         C         D
2016-03-02 -2.243868  0.027009 -1.294775 -0.080856
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302
2016-03-04 -0.373900 -1.076556 -0.193431  0.771121
2016-03-05 -0.461388 -0.404523  1.015933 -2.771721
df['tag'] = ['a'] * 2 + ['b'] * 3 + ['c'] #添加新的列
>>>
                   A         B         C         D tag
2016-03-01  0.819810 -0.152730 -1.177506  0.301507   a
2016-03-02 -2.243868  0.027009 -1.294775 -0.080856   a
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302   b
2016-03-04 -0.373900 -1.076556 -0.193431  0.771121   b
2016-03-05 -0.461388 -0.404523  1.015933 -2.771721   b
2016-03-06  0.125354  1.777238  0.350636 -1.049762   c
df[df.tag.isin(['a', 'c'])] #用'a','c'過濾
>>>
                   A         B         C         D tag
2016-03-01  0.819810 -0.152730 -1.177506  0.301507   a
2016-03-02 -2.243868  0.027009 -1.294775 -0.080856   a
2016-03-06  0.125354  1.777238  0.350636 -1.049762   c

四、修改數據

df
>>>
                   A         B         C         D tag
2016-03-01  0.819810 -0.152730 -1.177506  0.301507   a
2016-03-02 -2.243868  0.027009 -1.294775 -0.080856   a
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302   b
2016-03-04 -0.373900 -1.076556 -0.193431  0.771121   b
2016-03-05 -0.461388 -0.404523  1.015933 -2.771721   b
2016-03-06  0.125354  1.777238  0.350636 -1.049762   c
  • 添加新的列
s = pd.Series(np.arange(6),index=pd.date_range('20160302', periods=6))
s
>>>
2016-03-02    0
2016-03-03    1
2016-03-04    2
2016-03-05    3
2016-03-06    4
2016-03-07    5
Freq: D, dtype: int32

df['E'] = s
df
>>>
                   A         B         C         D tag    E
2016-03-01  0.819810 -0.152730 -1.177506  0.301507   a  NaN
2016-03-02 -2.243868  0.027009 -1.294775 -0.080856   a  0.0
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302   b  1.0
2016-03-04 -0.373900 -1.076556 -0.193431  0.771121   b  2.0
2016-03-05 -0.461388 -0.404523  1.015933 -2.771721   b  3.0
2016-03-06  0.125354  1.777238  0.350636 -1.049762   c  4.0
  • 修改某一個數據
df.loc['20160301', 'A'] = 0.2
# df.['20160301', 'A'] = 0.2 will not have effect 

df.at[pd.Timestamp('20160301'), 'A'] = 0.4

df.iat[0, 0] = 0.6

df.loc[:, 'A'] = np.arange(10, 16) #修改A列所有數據

df2 = df.loc[:, ['B', 'C']].copy()
df2[df2 > 0] = -df2 #將所有大於0的數取反
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章