pandas库基础笔记

基础概念

  • DataFrame,相当于一个数据表,存储了所有的数据,包含行和命名的列
  • Series,相当于一个列,一个DataFrame有一个或者多个Series

简单地建立一个Series:

pd.Series(['San Francisco', 'San Jose', 'Sacramento'])

DataFrame可以通过字典的方式,来映射列的名和列的编号,比如:

city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
population = pd.Series([852469, 1015785, 485199])

test = pd.DataFrame({ 'City name': city_names, 'Population': population })

print(test)

得到如下输出:

       City name  Population
0  San Francisco      852469
1       San Jose     1015785
2     Sacramento      485199

如果我们只是想输出数据集的前几行,可以使用head属性,默认输出前五行。

print(test.head(1))

输出:

       City name  Population
0  San Francisco      852469

字典数据可以进行pandas化,那么反过来,pandas数据也可以进行字典化,一上面的数据为例子:

import pandas as pd

city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
population = pd.Series([852469, 1015785, 485199])

my_data = pd.DataFrame({'City name': city_names, 'Population': population})

my_dic = dict(my_data)
print(my_dic)

输出结果:

{'City name': 0    San Francisco
1         San Jose
2       Sacramento
Name: City name, dtype: object, 'Population': 0     852469
1    1015785
2     485199
Name: Population, dtype: int64}

总结一下,pandas可以看成一个高阶的字典类型的数据(可能不是十分恰当)

获取数据

可以通过字典的方式引用列,支持索引和切片操作。
比如:

print(test['City name'])
print(test['City name'][1])
print(test['City name'][0:2])

输出结果

0    San Francisco
1         San Jose
2       Sacramento
Name: City name, dtype: object
San Jose
0    San Francisco
1         San Jose
Name: City name, dtype: object

使用describe输出详细信息:

print(test.describe())

输出:

count    3.000000e+00
mean     7.844843e+05
std      2.717477e+05
min      4.851990e+05
25%      6.688340e+05
50%      8.524690e+05
75%      9.341270e+05
max      1.015785e+06
dtype: float64

操作数据

  1. 支持一般的python数值计算
  2. 支持numpy库函数的计算
  3. 支持类似于python的map操作,需要使用apply方法:
    `python
    print(population.apply(lambda x: x > 1000000))

把子列转化成新的Dataframe数据

把一列数据转换成新的Dataframe类型 :

import pandas as pd

c1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})

print(data)
print(type(data))

tmp = data['c1']  # 仅仅使用一个中括号
print(tmp)
print(type(tmp))

tmp1 = data[['c1']]  # 使用两层中括号
print(tmp1)
print(type(tmp1))

tmp2 = data[['c1', 'c2']]
print(tmp2)
print(type(tmp2))

结果

  c1  c2 c3
0  a   1  A
1  b   2  B
2  c   3  C
3  d   4  D
<class 'pandas.core.frame.DataFrame'>
0    a
1    b
2    c
3    d
Name: c1, dtype: object
<class 'pandas.core.series.Series'>
  c1
0  a
1  b
2  c
3  d
<class 'pandas.core.frame.DataFrame'>
  c1  c2
0  a   1
1  b   2
2  c   3
3  d   4
<class 'pandas.core.frame.DataFrame'>

读取数据和存储数据

从网络或者本地文件中读取csv数据,或者把已有的数据存到csv文件中。一般和os配合使用

import os
import pandas as pd

my_data = None
#  先判断是否存在文件,不存在直接从网络下载,存在的话直接读取
if os.path.exists('data.csv'):
    my_data = pd.read_csv('data.csv', sep=",")
else:
    my_data = pd.read_csv(
        "https://storage.googleapis.com/mledu-datasets/california_housing_train.csv",
        sep=",")
    my_data.to_csv('data.csv')

另一种从文件中读取数据的方式:

import os
import pandas as pd
import numpy as np

N = 2

if os.path.exists('my_data.csv'):
    my_data = pd.read_csv('my_data.csv')
else:
    c1 = 20 * np.ones(N) + np.random.randn(N) * 2.0  # 20-25的正太分布
    c2 = 3 * np.ones(N) + np.random.randn(N)  # 3-4的正太分布
    c3 = -7 * np.ones(N) + np.random.randn(N)  # -6~-7正太
    res = c1 + c2 + c3
    c1 = pd.Series(c1)
    c2 = pd.Series(c2)
    c3 = pd.Series(c3)
    res = pd.Series(res)
    my_data = pd.DataFrame({"res": res, "c1": c1, "c2": c2, "c3": c3})
    my_data.to_csv('my_data.csv')
# 自定义命名列,从第0行开始读取
tmp = pd.read_csv(filepath_or_buffer='my_data.csv', names=['c1', 'c2', 'c3', 'res'], header=0)
print(tmp)                   

注意,上述方法中,如果新命名的数据列与原来的数据列不一致,那么会以新命名的数据列为准!!

插入和删除列(行)

pop弹出一列

弹出制定的列,并返回。

import pandas as pd

c1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})

tmp = data.pop('c1')  # Series类型

print(tmp)
print(type(tmp))

print(data)

输出结果:

0    a
1    b
2    c
3    d
Name: c1, dtype: object
<class 'pandas.core.series.Series'>
   c2 c3
0   1  A
1   2  B
2   3  C
3   4  D

insert插入数据

在制定的位置插入一列数据

import pandas as pd

c1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})
data.pop('c1')  # 删除第一列
data.insert(loc=0, column='c1', value=c1)  # 重新插入到第一列
print(data)

drop删除数据

import pandas as pd

c1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})

# 列的名称,axis=1表示对列进行删除,axis=0表示删除行,需要添加行的索引;inplace=True表示在原数据上操作
data.drop(columns='c1', axis=1, inplace=True) 
print(data)

输出:

   c2 c3
0   1  A
1   2  B
2   3  C
3   4  D

分位点和分位数

根据给定的分位数,计算出分位点,函数pd.Datafrane.quantile()

import pandas as pd
import numpy as np

df4 = pd.DataFrame(np.arange(100).reshape(20, 5),
                   columns=list('abcde'))
print(df4)

for i in np.arange(0, 1, 0.2):
    print(df4.quantile(i))

输出每一列的分位点:

a   b   c   d   e
0    0   1   2   3   4
1    5   6   7   8   9
2   10  11  12  13  14
3   15  16  17  18  19
4   20  21  22  23  24
5   25  26  27  28  29
6   30  31  32  33  34
7   35  36  37  38  39
8   40  41  42  43  44
9   45  46  47  48  49
10  50  51  52  53  54
11  55  56  57  58  59
12  60  61  62  63  64
13  65  66  67  68  69
14  70  71  72  73  74
15  75  76  77  78  79
16  80  81  82  83  84
17  85  86  87  88  89
18  90  91  92  93  94
19  95  96  97  98  99
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
Name: 0.0, dtype: float64
a    19.0
b    20.0
c    21.0
d    22.0
e    23.0
Name: 0.2, dtype: float64
a    38.0
b    39.0
c    40.0
d    41.0
e    42.0
Name: 0.4, dtype: float64
a    57.0
b    58.0
c    59.0
d    60.0
e    61.0
Name: 0.6000000000000001, dtype: float64
a    76.0
b    77.0
c    78.0
d    79.0
e    80.0
Name: 0.8, dtype: float64

还可以求解多个分位点,用np.array传入数据:

import numpy as np
import pandas as pd

num_buckets = 10
df = pd.DataFrame(np.arange(100).reshape(10, 10))
boundaries = np.arange(1.0, num_buckets) / num_buckets
print(boundaries)
print(df)
quantitles = df.quantile(boundaries)
print(quantitles)

输出结果:

[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
    0   1   2   3   4   5   6   7   8   9
0   0   1   2   3   4   5   6   7   8   9
1  10  11  12  13  14  15  16  17  18  19
2  20  21  22  23  24  25  26  27  28  29
3  30  31  32  33  34  35  36  37  38  39
4  40  41  42  43  44  45  46  47  48  49
5  50  51  52  53  54  55  56  57  58  59
6  60  61  62  63  64  65  66  67  68  69
7  70  71  72  73  74  75  76  77  78  79
8  80  81  82  83  84  85  86  87  88  89
9  90  91  92  93  94  95  96  97  98  99
        0     1     2     3     4     5     6     7     8     9
0.1   9.0  10.0  11.0  12.0  13.0  14.0  15.0  16.0  17.0  18.0
0.2  18.0  19.0  20.0  21.0  22.0  23.0  24.0  25.0  26.0  27.0
0.3  27.0  28.0  29.0  30.0  31.0  32.0  33.0  34.0  35.0  36.0
0.4  36.0  37.0  38.0  39.0  40.0  41.0  42.0  43.0  44.0  45.0
0.5  45.0  46.0  47.0  48.0  49.0  50.0  51.0  52.0  53.0  54.0
0.6  54.0  55.0  56.0  57.0  58.0  59.0  60.0  61.0  62.0  63.0
0.7  63.0  64.0  65.0  66.0  67.0  68.0  69.0  70.0  71.0  72.0
0.8  72.0  73.0  74.0  75.0  76.0  77.0  78.0  79.0  80.0  81.0
0.9  81.0  82.0  83.0  84.0  85.0  86.0  87.0  88.0  89.0  90.0

显示了每一个列的,的对应的分位点。

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/80686272
今日推荐