1、读取时抽样1%
对于动辄就几十或几百个 G 的数据,在读取这么大数据时,有没有办法随机选取一小部分数据,然后读入内存,快速了解数据和开展 EDA ?
使用 Pandas 的 skiprows 和 概率知识,就能做到。
下面解释具体怎么做。
如下所示,读取某 100 G 大小的 big_data.csv 数据
  1. 使用 skiprows 参数,
  2. x > 0 确保首行读入,
  3. np.random.rand() > 0.01 表示 99% 的数据都会被随机过滤掉
言外之意,只有全部数据的 1% 才有机会选入内存中。
import
pandas
as
pd

import
numpy
as
np


df = pd.read_csv(
"big_data.csv"
,

skiprows =
lambda
x: x>
0and
np.random.rand() >
0.01
)


print(
"The shape of the df is {}.

It has been reduced 100 times!"
.format(df.shape))

使用这种方法,读取的数据量迅速缩减到原来的 1% ,对于迅速展开数据分析有一定的帮助。
2、replace 做清洗
Pandas 的强项在于数据分析,自然就少不了对数据清洗的支持。
今天学习一个快速清洗数据的小技巧,在某列上使用 replace 方法和正则,快速完成值的清洗。
源数据:
d = {
"customer"
: [
"A"
,
"B"
,
"C"
,
"D"
],

"sales"
:[
1100
,
"950.5RMB"
,
"$400"
,
" $1250.75"
]}


df = pd.DataFrame(d)

df

打印结果:

customer sales

0
A
1100
1
B
950.5
RMB

2
C $
400
3
D $
1250.75
看到 sales 列的值,有整型,浮点型+RMB后变为字符串型,还有美元+整型,美元+浮点型。
我们的目标:清洗掉 RMB$ 符号,转化这一列为浮点型。
一行代码搞定:(点击代码区域,向右滑动,查看完整代码)
df[
"sales"
] = df[
"sales"
].replace(
"[$,RMB]"
,
""
, regex =
True
).astype(
"float"
)

使用正则替换,将要替换的字符放到列表中 [$,RMB],替换为空字符,即 ""
最后使用 astype 转为 float
打印结果:

customer sales

0
A
1100.00
1
B
950.50
2
C
400.00
3
D
1250.75
Done ~
如果不放心,再检查下值的类型:
df[
"sales"
].apply(type)

打印结果:
0 <class
'
float
'>

1 <
class
'
float
'>

2 <
class
'
float
'>

3 <
class
'
float
'>

3、宽DF变长
为什么需要宽 DF 变长 ?
构造一个 DataFrame:
d = {\

"district_code"
: [
12345
,
56789
,
101112
,
131415
],

"apple"
: [
5.2
,
2.4
,
4.2
,
3.6
],

"banana"
: [
3.5
,
1.9
,
4.0
,
2.3
],

"orange"
: [
8.0
,
7.5
,
6.4
,
3.9
]

}


df = pd.DataFrame(d)

df

打印结果:

district_code apple banana orange

0123455.23.58.0
1567892.41.97.5
21011124.24.06.4
31314153.62.33.9
5.2 表示 12345 区域的 apple 价格,并且 apple, banana, orange,这三列都是一种水果,那么如何把这三列合并为一列?
使用 pd.melt
具体参数取值,大家根据此例去推敲:
df = df.melt(\

id_vars =
"district_code"
,

var_name =
"fruit_name"
,

value_name =
"price"
)

df

打印结果:

district_code fruit_name price

012345
apple
5.2
156789
apple
2.4
2101112
apple
4.2
3131415
apple
3.6
412345
banana
3.5
556789
banana
1.9
6101112
banana
4.0
7131415
banana
2.3
812345
orange
8.0
956789
orange
7.5
10101112
orange
6.4
11131415
orange
3.9
以上就是长 DataFrame,对应的原 DataFrame 是宽 DF.
看明白吗?
4、转 datetime
告诉年和 day_of_year,怎么转 datetime?
原 DataFrame
d = {\

"year"
: [
2019
,
2019
,
2020
],

"day_of_year"
: [
350
,
365
,
1
]

}

df = pd.DataFrame(d)

df

打印结果:
year day_of_year

02019350
12019365
220201
转 datetime 的 trick。
Step 1: 创建整数
df[
"int_number"
] = df[
"year"
]*
1000
+ df[
"day_of_year"
]

df

打印结果:
year day_of_year int_number

020193502019350
120193652019365
2202012020001
Step 2: to_datetime
df[
"date"
] = pd.to_datetime(df[
"int_number"
], format =
"%Y%j"
)

df

注意 "%Y%j" 中转化格式 j
打印结果:
year day_of_year int_number date

0201935020193502019-12-16
1201936520193652019-12-31
22020120200012020-01-01
以上就是 Pandas 做数据分析的 4 个 trick。
本文经授权转载自Python与算法社区
继续阅读
阅读原文