# 肝了一夜，8000字概括精髓，pandas必知必会50例！

pandas 必会 一夜 概括 精髓

### 准备需要的数据集

``````index = pd.date_range("1/1/2000", periods=8)
series = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=["A", "B", "C"])``````

`head()``tail()`方法是用来查看数据集当中的前几行和末尾几行的，默认是查看5行，当然读者朋友也可以自行设定行数

``````series2 = pd.Series(np.random.randn(100))

output

``````0    0.733801
1   -0.740149
2   -0.031863
3    2.515542
4    0.615291
dtype: float64``````

``series2.tail()``

output

``````95   -0.526625
96   -0.234975
97    0.744299
98    0.434843
99   -0.609003
dtype: float64``````

### 数据的统计分析

`pandas`当中用`describe()`方法来对表格中的数据做一个概括性的统计分析，例如

``series2.describe()``

output

``````count    100.000000
mean       0.040813
std        1.003012
min       -2.385316
25%       -0.627874
50%       -0.029732
75%        0.733579
max        2.515542
dtype: float64``````

``series2.describe(percentiles=[0.05, 0.25, 0.75, 0.95])``

output

``````count    100.000000
mean       0.040813
std        1.003012
min       -2.385316
5%        -1.568183
25%       -0.627874
50%       -0.029732
75%        0.733579
95%        1.560211
max        2.515542
dtype: float64``````

``````s = pd.Series(["a", "a", "b", "b", "a", "a", "d", "c", "d", "a"])
s.describe()``````

output

``````count     10
unique     4
top        a
freq       5
dtype: object``````

``````df2 = pd.DataFrame({"a": ["Yes", "Yes", "No", "No"], "b": np.random.randn(4)})
df2.describe()``````

output

``````b
count  4.000000
mean   0.336053
std    1.398306
min   -1.229344
25%   -0.643614
50%    0.461329
75%    1.440995
max    1.650898``````

``df2.describe(include=["object"])``

output

``````a
count     4
unique    2
top     Yes
freq      2``````

``df2.describe(include=["number"])``

output

``````b
count  4.000000
mean  -0.593695
std    0.686618
min   -1.538640
25%   -0.818440
50%   -0.459147
75%   -0.234401
max    0.082155``````

``df2.describe(include="all")``

output

``````a         b
count     4  4.000000
unique    2       NaN
top     Yes       NaN
freq      2       NaN
mean    NaN  0.292523
std     NaN  1.523908
min     NaN -1.906221
25%     NaN -0.113774
50%     NaN  0.789560
75%     NaN  1.195858
max     NaN  1.497193``````

### 最大/最小值的位置

`idxmin()``idxmax()`方法是用来查找表格当中最大/最小值的位置，返回的是值的索引

``````s1 = pd.Series(np.random.randn(5))
s1``````

output

``s1.idxmin(), s1.idxmax()``

output

``(0, 3)``

``````df1 = pd.DataFrame(np.random.randn(5, 3), columns=["A", "B", "C"])
df1.idxmin(axis=0)``````

output

``````A    4
B    2
C    1
dtype: int64``````

``df1.idxmin(axis=1)``

output

``````0    C
1    C
2    C
3    B
4    A
dtype: object``````

### `value_counts()`方法

`pandas`当中的`value_counts()`方法主要用于数据表的计数以及排序，用来查看表格当中，指定列有多少个不同的数据值并且计算不同值在该列当中出现的次数，先来看一个简单的例子

``````df = pd.DataFrame({'城市': ['北京', '广州', '上海', '上海', '杭州', '成都', '香港', '南京', '北京', '北京'],
'收入': [10000, 10000, 5500, 5500, 4000, 50000, 8000, 5000, 5200, 5600],
'年龄': [50, 43, 34, 40, 25, 25, 45, 32, 25, 25]})
df["城市"].value_counts()``````

output

``````北京    3

Name: 城市, dtype: int64``````

``df["收入"].value_counts(ascending=True)``

output

``````4000     1
50000    1
8000     1
5000     1
5200     1
5600     1
10000    2
5500     2
Name: 收入, dtype: int64``````

``df['年龄'].value_counts(ascending=True,normalize=True)``

output

``````50    0.1
43    0.1
34    0.1
40    0.1
45    0.1
32    0.1
25    0.4
Name: 年龄, dtype: float64``````

### 数据分组

``````ages = np.array([2,3,10,40,36,45,58,62,85,89,95,18,20,25,35,32])
pd.cut(ages, 5)``````

output

``````[(1.907, 20.6], (1.907, 20.6], (1.907, 20.6], (39.2, 57.8], (20.6, 39.2], ..., (1.907, 20.6], (1.907, 20.6], (20.6, 39.2], (20.6, 39.2], (20.6, 39.2]]
Length: 16
Categories (5, interval[float64, right]): [(1.907, 20.6] < (20.6, 39.2] < (39.2, 57.8] <
(57.8, 76.4] < (76.4, 95.0]]``````

``pd.cut(ages, 5, labels=[u"婴儿",u"少年",u"青年",u"中年",u"老年"])``

output

``````['婴儿', '婴儿', '婴儿', '青年', '少年', ..., '婴儿', '婴儿', '少年', '少年', '少年']
Length: 16
Categories (5, object): ['婴儿' < '少年' < '青年' < '中年' < '老年']``````

``pd.qcut(ages, [0,0.5,1], labels=['小朋友','大孩子'])``

output

``````['小朋友', '小朋友', '小朋友', '大孩子', '大孩子', ..., '小朋友', '小朋友', '小朋友', '小朋友', '小朋友']
Length: 16
Categories (2, object): ['小朋友' < '大孩子']``````

### 引用函数

• `pipe()`

• `apply()``applymap()`

• `agg()``transform()`

#### `pipe()`方法

``````def extract_city_name(df):
df["state_name"] = df["state_and_code"].str.split(",").str.get(0)
return df
df["state_and_country"] = df["state_name"] + country_name
return df``````

``````df_p = pd.DataFrame({"city_and_code": ["Arizona, AZ"]})
df_p = pd.DataFrame({"state_and_code": ["Arizona, AZ"]})

output

``````state_and_code state_name state_and_country
0    Arizona, AZ    Arizona       Arizona_USA``````

#### `apply()`方法和`applymap()`方法

`apply()`方法可以对表格中的数据按照行或者是列方向进行处理，默认是按照列方向，如下

``df.apply(np.mean)``

output

``````A   -0.101751
B   -0.360288
C   -0.637433
dtype: float64``````

``df.apply(np.mean, axis = 1)``

output

``````0   -0.803675
1   -0.179640
2   -1.200973
3    0.156888
4    0.381631
5    0.049274
6    1.174923
7    0.612591
dtype: float64``````

``df.apply(lambda x: x.max() - x.min())``

output

``````A    1.922863
B    2.874672
C    1.943930
dtype: float64``````

``````df = pd.DataFrame(np.random.randn(5, 3), columns=["A", "B", "C"])
def normalize(x):
return (x - x.mean()) / x.std()``````

``df.apply(normalize)``

output

``````A         B         C
0  1.149795  0.390263 -0.813770
1  0.805843 -0.532374  0.859627
2  0.047824 -0.085334 -0.067179
3 -0.903319 -1.215023  1.149538
4 -1.100144  1.442467 -1.128216``````

`apply()`方法作用于数据集当中的每个行或者是列，而`applymap()`方法则是对数据集当中的所有元素都进行处理

``````df = pd.DataFrame({'key1' : ['a', 'c', 'b', 'b', 'd'],
'key2' : ['one', 'two', 'three', 'two', 'one'],
'data1' : np.arange(1, 6),
'data2' : np.arange(10,15)})``````

output

``````key1   key2  data1  data2
0    a    one      1     10
1    c    two      2     11
2    b  three      3     12
3    b   four      4     13
4    d   five      5     14``````

``````def add_A(x):
return "A" + str(x)

output

``````key1    key2 data1 data2
0   Aa    Aone    A1   A10
1   Ac    Atwo    A2   A11
2   Ab  Athree    A3   A12
3   Ab   Afour    A4   A13

``df.applymap(add_A).applymap(lambda x: x.split("A")[1])``

output

``````key1   key2 data1 data2
0    a    one     1    10
1    c    two     2    11
2    b  three     3    12
3    b   four     4    13
4    d   five     5    14``````

### `agg()`方法和`transform()`方法

`agg()`方法本意上是聚合函数，我们可以将用于统计分析的一系列方法都放置其中，并且放置多个

``````df = pd.DataFrame(np.random.randn(5, 3), columns=["A", "B", "C"])
df.agg(np.sum)``````

output

``````A    0.178156
B    3.233845
C   -0.859622
dtype: float64``````

``df.agg("sum")``

output

``````A   -0.606484
B   -1.491742
C   -1.732083
dtype: float64``````

``df.agg(["sum", "mean", "median"])``

output

``````A         B         C
sum     1.964847  3.855801  0.630042
mean    0.392969  0.771160  0.126008
median  0.821005  0.714804 -0.273685``````

``df.agg(["sum", lambda x: x.mean()])``

output

``````A         B         C
sum      -0.066486 -1.288341 -1.236244
<lambda> -0.013297 -0.257668 -0.247249``````

``````def my_mean(x):
return x.mean()

df.agg(["sum", my_mean])``````

output

``````A         B         C
sum     -4.850201 -1.544773  0.429007
my_mean -0.970040 -0.308955  0.085801``````

``df.agg({"A": "sum", "B": "mean"})``

output

``````A   -0.801753
B    0.097550
dtype: float64``````

``df.agg({"A": ["sum", "min"], "B": "mean"})``

output

``````A         B
sum   0.911243       NaN
min  -0.720225       NaN
mean       NaN  0.373411``````

``````df = pd.DataFrame(
{
"A": [1, 2, 3],
"B": [1.0, 2.0, 3.0],
"C": ["test1", "test2", "test3"],
"D": pd.date_range("20211101", periods=3),
}
)
df.agg(["min", "sum"])``````

output

``````A    B                C          D
min  1  1.0            test1 2021-11-01
sum  6  6.0  test1test2test3        NaT``````

### 索引和列名的重命名

``````df1 = pd.DataFrame(np.random.randn(5, 3), columns=["A", "B", "C"],
index = ["a", "b", "c", "d", "e"])``````

output

``````A         B         C
a  0.343690  0.869984 -1.929814
b  1.025613  0.470155 -0.242463
c -0.400908 -0.362684  0.226857
d -1.339706 -0.302005 -1.784452
e -0.957026 -0.813600  0.215098``````

``````df1.rename(columns={"A": "one", "B": "two", "C": "three"},
index={"a": "apple", "b": "banana", "c": "cat"})``````

output

``````one       two     three
apple   0.383813  0.588964 -0.162386
banana -0.462068 -2.938896  0.935492
cat    -0.059807 -1.987281  0.095432
d      -0.085230  2.013733 -1.324039
e      -0.678352  0.306776  0.808697``````

``df1.rename({"A": "one", "B": "two", "C": "three"}, axis = "columns")``

output

``````one       two     three
a -0.997108 -1.383011  0.474298
b  1.009910  0.286303  1.120783
c  1.130700 -0.566922  1.841451
d -0.350438 -0.171079 -0.079804
e  0.988050 -0.524604  0.653306``````

``df1.rename({"a": "apple", "b": "banana", "c": "cat"}, axis = "index")``

output

``````A         B         C
apple   0.590589 -0.311803 -0.782117
banana  1.528043 -0.944476 -0.337584
cat     1.326057 -0.087368  0.041444
d       1.079768 -0.098314 -0.210999
e       1.654869  1.170333  0.506194``````

### 排序

`pandas`当中，我们可以针对数据集当中的值来进行排序

``````df1 = pd.DataFrame(
{"one": [2, 1, 1, 1], "two": [1, 3, 2, 4], "three": [5, 4, 3, 2]}
)``````

output

``````one  two  three
0    2    1      5
1    1    3      4
2    1    2      3
3    1    4      2``````

``df1.sort_values(by = "three")``

output

``````one  two  three
3    1    4      2
2    1    2      3
1    1    3      4
0    2    1      5``````

``df1.sort_values(by = ["one", "two"])``

output

``````one  two  three
2    1    2      3
1    1    3      4
3    1    4      2
0    2    1      5``````

``df1.sort_values("two", ascending=False)``

output

``````one  two  three
3    1    4      2
1    1    3      4
2    1    2      3
0    2    1      5``````

### 数据类型的转换

``````df2 = pd.DataFrame(
{
"A": pd.Series(np.random.randn(5), dtype="float16"),
"B": pd.Series(np.random.randn(5)),
"C": pd.Series(np.array(np.random.randn(5), dtype="uint8")),
}
)``````

output

``````A         B    C
0 -0.498779 -0.501512    0
1 -0.055817 -0.528227  254
2 -0.914551  0.763298    1
3 -0.916016  1.366833    0
4  1.993164  1.834457    0``````

``````A    float16
B    float64
C      uint8
dtype: object``````

``df2["B"].astype("int64")``

output

``````0    0
1    0
2    0
3    2
4    1
Name: B, dtype: int64``````

### 根据数据类型来筛选

``````df = pd.DataFrame(
{
"string_1": list("abcde"),
"int64_1": list(range(1, 6)),
"uint8_1": np.arange(3, 8).astype("u1"),
"float64_1": np.arange(4.0, 9.0),
"bool1": [True, False, True, True, False],
"bool2": [False, True, False, False, True],
"dates_1": pd.date_range("now", periods=5),
"category_1": pd.Series(list("ABCDE")).astype("category"),
}
)``````

output

``````string_1  int64_1  uint8_1  ...  bool2                      dates_1  category_1
0      a      1      3  ...  False 2021-11-10 10:43:05.957685         A
1      b      2      4  ...   True 2021-11-11 10:43:05.957685         B
2      c      3      5  ...  False 2021-11-12 10:43:05.957685         C
3      d      4      6  ...  False 2021-11-13 10:43:05.957685         D
4      e      5      7  ...   True 2021-11-14 10:43:05.957685         E``````

``df.dtypes``

output

``````string_1              object
int64_1                int64
uint8_1                uint8
float64_1            float64
bool1                   bool
bool2                   bool
dates_1       datetime64[ns]
category_1          category
dtype: object``````

``df.select_dtypes(include=[bool])``

output

``````bool1  bool2
0   True  False
1  False   True
2   True  False
3   True  False
4  False   True``````

``df.select_dtypes(include=['int64'])``

output

``````int64_1
0      1
1      2
2      3
3      4
4      5``````
``````推荐阅读:

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火，我用机器学习做个迷你推荐系统电影

https://blog.csdn.net/cainiao_python/article/details/121528458