Skip to content

Commit d2c9a11

Browse files
committed
185-189
1 parent e64854f commit d2c9a11

File tree

6 files changed

+193
-5
lines changed

6 files changed

+193
-5
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,13 @@
263263
| 182 | [完成数据下采样,调整步长由小时为天](./md/182.md) | pandas resample | v1.0 | ⭐️⭐⭐ |
264264
| 183 | [如何用 Pandas 快速生成时间序列数据](/md/183.md) | pandas util | v1.0 | ⭐️⭐⭐ |
265265
| 184 | [如何快速找出 DataFrame 所有列 null 值个数](/md/184.md) | pandas isnull sum | v1.0 | ⭐️⭐⭐ |
266+
| 185 | [重新排序 DataFrame 的列](/md/185.md) | pandas dataframe | v1.0 | ⭐️⭐⭐ |
267+
| 186 | [使用 count 统计词条 出现次数](/md/186.md) | pandas count | v1.0 | ⭐️⭐⭐ |
268+
| 187 | [split 求时分(HH:mm)的分钟差](/md/187.md) | pandas split | v1.0 | ⭐️⭐⭐ |
269+
| 188 | [melt透视数据小技巧](/md/188.md) | pandas melt | v1.0 | ⭐️⭐⭐ |
270+
| 189 | [pivot 透视小技巧](/md/189.md) | pandas melt | v1.0 | ⭐️⭐⭐ |
271+
272+
266273

267274
### Python 实战
268275

md/185.md

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,30 @@
66
@version
77
@date 2020/03/23
88
```
9-
9+
10+
### 第185个小例子:重新排序 DataFrame 的列
11+
12+
下面给出 2 种简便的小技巧。先构造数据:
13+
14+
```python
15+
df = pd.DataFrame(np.random.randint(0,20,size=(5,7)) \
16+
,columns=list('ABCDEFG'))
17+
df
18+
```
19+
20+
方法1,直接了当:
21+
22+
```python
23+
df2 = df[["A", "C", "D", "F", "E", "G", "B"]]
24+
df2
25+
```
26+
27+
方法2,也了解下:
28+
29+
```python
30+
cols = df.columns[[0, 2 , 3, 5, 4, 6, 1]]
31+
df3 = df[cols]
32+
df3
33+
```
34+
35+
也能得到方法1的结果。

md/186.md

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,37 @@
66
@version
77
@date 2020/03/24
88
```
9-
9+
10+
### 第186个小例子:使用 count 统计词条 出现次数
11+
12+
读入 IMDB-Movie-Data 数据集,1000行数据:
13+
14+
```python
15+
df = pd.read_csv("../input/imdb-data/IMDB-Movie-Data.csv")
16+
df['Title']
17+
```
18+
19+
打印 `Title` 列:
20+
21+
```python
22+
0 Guardians of the Galaxy
23+
1 Prometheus
24+
2 Split
25+
3 Sing
26+
4 Suicide Squad
27+
...
28+
995 Secret in Their Eyes
29+
996 Hostel: Part II
30+
997 Step Up 2: The Streets
31+
998 Search Party
32+
999 Nine Lives
33+
Name: Title, Length: 1000, dtype: object
34+
```
35+
36+
标题是由几个单词组成,用空格分隔。
37+
38+
```python
39+
df["words_count"] = df["Title"].str.count(" ") + 1
40+
df[["Title","words_count"]]
41+
```
42+

md/187.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,26 @@
66
@version
77
@date 2020/03/25
88
```
9-
9+
10+
### 第187个小例子:split 求时分(HH:mm)的分钟差
11+
12+
split 是更加高效的实现,同样需要先转化为 str 类型:
13+
14+
```python
15+
df['a'] = df['a'].astype(str)
16+
df['b'] = df['b'].astype(str)
17+
```
18+
19+
其次 split:
20+
21+
```python
22+
df['asplit'] = df['a'].str.split(':')
23+
df['bsplit'] = df['b'].str.split(':')
24+
```
25+
26+
使用 apply 操作每个元素,转化为分钟数:
27+
28+
```python
29+
df['amins'] = df['asplit'].apply(lambda x: int(x[0])*60 + int(x[1]))
30+
df['bmins'] = df['bsplit'].apply(lambda x: int(x[0])*60 + int(x[1]))
31+
```

md/188.md

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,64 @@
66
@version
77
@date 2020/03/26
88
```
9-
9+
10+
### 第188个小例子:melt透视数据小技巧
11+
12+
melt 方法固定某列为一个维度,组合其他列名为另一个维度,实现宽表融化为长表:
13+
14+
```python
15+
zip_code factory warehouse retail
16+
0 12345 100 200 1
17+
1 56789 400 300 2
18+
2 101112 500 400 3
19+
3 131415 600 500 4
20+
```
21+
22+
固定列`zip_code`,组合`factory``warehouse``retail` 三个列名为一个维度,按照这种方法凑齐两个维度后,数据一定变长。
23+
24+
pandas 的 melt 方法演示如下:
25+
26+
```python
27+
In [49]: df = df.melt(id_vars = "zip_code")
28+
```
29+
30+
若melt方法,参数`value_vars`不赋值,默认剩余所有列都是value_vars,所以结果如下:
31+
32+
```python
33+
zip_code variable value
34+
0 12345 factory 100
35+
1 56789 factory 400
36+
2 101112 factory 500
37+
3 131415 factory 600
38+
4 12345 warehouse 200
39+
5 56789 warehouse 300
40+
6 101112 warehouse 400
41+
7 131415 warehouse 500
42+
8 12345 retail 1
43+
9 56789 retail 2
44+
10 101112 retail 3
45+
11 131415 retail 4
46+
```
47+
48+
若只想查看 factory 和 retail,则 `value_vars` 赋值为它们即可:
49+
50+
```python
51+
In [62]: df_melt2 = df.melt(id_vars = "zip_code",value_vars=['factory','reta
52+
...: il'])
53+
```
54+
55+
结果:
56+
57+
```python
58+
zip_code variable value
59+
0 12345 factory 100
60+
1 56789 factory 400
61+
2 101112 factory 500
62+
3 131415 factory 600
63+
4 12345 retail 1
64+
5 56789 retail 2
65+
6 101112 retail 3
66+
7 131415 retail 4
67+
```
68+
69+
melt 透视数据后,因为组合多个列为1列,所以数据一定变长。

md/189.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,44 @@
66
@version
77
@date 2020/03/27
88
```
9-
9+
10+
### 第189个小例子: pivot 透视小技巧
11+
12+
melt 是融化数据,而 `pivot` 结冰数据,它们是一对互逆操作。
13+
14+
这是上面 melt 后的数据:
15+
16+
```python
17+
zip_code variable value
18+
0 12345 factory 100
19+
1 56789 factory 400
20+
2 101112 factory 500
21+
3 131415 factory 600
22+
4 12345 retail 1
23+
5 56789 retail 2
24+
6 101112 retail 3
25+
7 131415 retail 4
26+
```
27+
28+
现在想要还原为:
29+
30+
```python
31+
variable factory retail
32+
zip_code
33+
12345 100 1
34+
56789 400 2
35+
101112 500 3
36+
131415 600 4
37+
```
38+
39+
如何实现?
40+
41+
使用 `pivot` 方法很容易做到:
42+
43+
```python
44+
df_melt2.pivot(index='zip_code',columns='variable')
45+
```
46+
47+
index 设定第一个轴,为 zip_code,columns 设定哪些列或哪个列的不同取值组合为一个轴,此处设定为 variable 列,它一共有 2 种不同的取值,分别为 factory, retail,pivot 透视后变为列名,也就是 axis = 1 的轴
48+
49+
pivot 方法没有聚合功能,它的升级版为 `pivot_table` 方法,能对数据聚合。

0 commit comments

Comments
 (0)