Pandas数据分析100例
·
Pandas数据分析100例
1.列表转Series
import pandas as pd
if __name__ == '__main__':
courses = ['语文', '数学', '英语', '计算机']
result = pd.Series(courses)
print(result)
"""
0 语文
1 数学
2 英语
3 计算机
dtype: object
"""
2.Dict转Series
import pandas as pd
grades = {'语文': 80, '数学':90, '英语': 100}
result = pd.Series(grades)
print(result)
"""
语文 80
数学 90
英语 100
dtype: int64
"""
3.Series转LIst
import pandas as pd
if __name__ == '__main__':
grades = {'语文': 80, '数学': 90, '英语': 100}
result = pd.Series(grades)
# print(result)
print(result.tolist())
"""
[80, 90, 100]
"""
4.Series转DataFrame
import pandas as pd
if __name__ == '__main__':
grades = {'语文': 80, '数学': 90, '英语': 100}
tmp = pd.Series(grades)
result = pd.DataFrame(tmp, columns=['grade'])
print(result)
"""
grade
语文 80
数学 90
英语 100
"""
5.Numpy创建Series
import pandas as pd, numpy as np
if __name__ == '__main__':
s = pd.Series(np.arange(10, 100, 10), index=np.arange(101, 110), dtype='float')
print(s)
101 10.0
102 20.0
103 30.0
104 40.0
105 50.0
106 60.0
107 70.0
108 80.0
109 90.0
dtype: float64
6.转换Series的数据类型
import pandas as pd
if __name__ == '__main__':
s = pd.Series(
data=["001", "002", "003", "004"],
index=list("abcd")
)
print(s)
print(s.astype(int)) # 类型
print(s.map(int)) # 函数
a 001
b 002
c 003
d 004
dtype: object
a 1
b 2
c 3
d 4
dtype: int32
a 1
b 2
c 3
d 4
dtype: int64
7.添加新数据
import pandas as pd
if __name__ == '__main__':
s = pd.Series(
data={'语文': 99, '数学': 100}
)
s = s.append(pd.Series(
data={'英语': 150}
))
print(s)
语文 99
数学 100
英语 150
dtype: int64
8.reset index 转换为df
import pandas as pd
if __name__ == '__main__':
s = pd.Series(
data={'语文': 99, '数学': 100}
)
s = s.reset_index()
s.columns = ['project', 'grade']
print(s)
project grade
0 语文 99
1 数学 100
9.Dict创建df
import pandas as pd
if __name__ == '__main__':
df = pd.DataFrame(
data={
'姓名': ['herio', 'xiaoo', 'gsda'],
'性别': ['男', '女', '男'],
'年龄': [18, 20, 19]
}
)
print(df)
姓名 性别 年龄
0 herio 男 18
1 xiaoo 女 20
2 gsda 男 19
10.df设置索引列
import pandas as pd
if __name__ == '__main__':
df = pd.DataFrame(
data={
'姓名': ['herio', 'xiaoo', 'gsda'],
'性别': ['男', '女', '男'],
'年龄': [18, 20, 19]
}
)
df.set_index('姓名', inplace=True)
print(df)
性别 年龄
姓名
herio 男 18
xiaoo 女 20
gsda 男 19
11.生成日期
import pandas as pd
if __name__ == '__main__':
res = pd.date_range(start='2022-01-01',end='2022-01-31')
res_1 = pd.date_range(start='2022-01-01',periods=31)
print(res,res_1,sep='\n')
取每年的所有周一(freq)
import pandas as pd
if __name__ == '__main__':
res = pd.date_range(start='2022-01-01',end='2022-12-31',freq='W-MON')
print(res)
生成某一天的二十四个小时的日期
import pandas as pd
if __name__ == '__main__':
res = pd.date_range(start='2022-01-01', periods=24, freq='H')
res_1 = pd.date_range(start='2022-01-01', end='2022-01-02', closed='left',freq='H')
print(res)
print(res_1)
日期生成DataFrame
import pandas as pd
if __name__ == '__main__':
data = pd.date_range(start='2022-02-01',periods=31)
res = pd.DataFrame(data=data,columns=['day'])
res['day_of_year'] = res['day'].dt.day_of_year
print(res)
day day_of_year
0 2022-02-01 32
1 2022-02-02 33
2 2022-02-03 34
.....
29 2022-03-02 61
30 2022-03-03 62
生成随机数据列df
import pandas as pd
import numpy as np
if __name__ == '__main__':
year = pd.date_range(start='2022-01-01',periods=1000)
data = {
'normal': np.random.normal(loc=0,scale=1,size=1000),
'uniform': np.random.uniform(low=0,high=1,size=1000),
'binomial': np.random.binomial(n=1,p=0.2)
}
df = pd.DataFrame(data=data,index=year)
print(df)
normal uniform binomial
2022-01-01 -1.212357 0.561198 0
2022-01-02 1.455127 0.671026 0
2022-01-03 1.458189 0.922212 0
2022-01-04 -0.164604 0.948922 0
2022-01-05 -0.292973 0.602961 0
... ... ... ...
2024-09-22 -0.350369 0.788879 0
2024-09-23 -0.716147 0.671242 0
2024-09-24 -0.345326 0.282493 0
2024-09-25 0.000214 0.735941 0
2024-09-26 0.072581 0.719543 0
打印前10行和后5行
print(df.head(10))
print()
print(df.tail(5))
描述基本信息
print(df.info())
print(df.describe())
DatetimeIndex: 1000 entries, 2022-01-01 to 2024-09-26
Freq: D
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 normal 1000 non-null float64
1 uniform 1000 non-null float64
2 binomial 1000 non-null int64
dtypes: float64(2), int64(1)
memory usage: 31.2 KB
None
normal uniform binomial
count 1000.000000 1000.000000 1000.0
mean -0.038351 0.513840 0.0
std 1.000126 0.289779 0.0
min -3.250206 0.000009 0.0
25% -0.732684 0.263531 0.0
50% -0.091297 0.521737 0.0
75% 0.612340 0.773006 0.0
max 3.682969 0.997907 0.0
统计数据列的值出现的次数
print(df['binomial'].value_counts())
前50行数据存到csv文件中
df.head(50).to_csv("数据前50行.csv")
csv读取为DataFrame
import pandas as pd
import numpy as np
if __name__ == '__main__':
df = pd.read_csv("数据前50行.csv",index_col=0)
print(df.info())
print(df.head(10))
12.股票数据
索引列设置为普通列
df.reset_index(inplace=True)
添加年份和月
import pandas as pd
if __name__ == '__main__':
df = pd.read_csv("00700.HK.csv")
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
print(df.head(10))
Date Open High Low Close Volume Year Month
0 2021-09-30 456.0 464.6 453.8 461.4 17335451 2021 9
1 2021-09-29 461.6 465.0 450.2 465.0 18250450 2021 9
2 2021-09-28 467.0 476.2 464.6 469.8 20947276 2021 9
3 2021-09-27 459.0 473.0 455.2 464.6 17966998 2021 9
4 2021-09-24 461.4 473.4 456.2 460.2 16656914 2021 9
5 2021-09-23 460.2 469.6 456.4 463.2 22210868 2021 9
6 2021-09-21 446.0 453.8 443.2 450.0 16556875 2021 9
7 2021-09-20 456.6 457.4 448.0 454.2 15513224 2021 9
8 2021-09-17 445.8 467.6 445.2 461.8 23982628 2021 9
9 2021-09-16 446.8 454.8 445.0 451.0 24519868 2021 9
按年份分组对Close字段求平均值
print(df.groupby('Year')['Close'].mean())
求Close最小值和对应的索引行
import pandas as pd
if __name__ == '__main__':
df = pd.read_csv("00700.HK.csv")
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
print(df['Close'].min())
print(df['Close'].argmin())
print(df.loc[[df['Close'].argmin()]])
3.375
4240
Date Open High Low Close Volume Year Month
4240 2004-07-26 3.45 3.5 3.375 3.375 7439000 2004 7
只处理需要的列
print(df[['Year', 'Open', 'High']].head(5))
删除不需要的列
df.drop(columns=['Low','High'],inplace=True)
print(df.head(5))
Date Open Close Volume Year Month
0 2021-09-30 456.0 461.4 17335451 2021 9
1 2021-09-29 461.6 465.0 18250450 2021 9
2 2021-09-28 467.0 469.8 20947276 2021 9
3 2021-09-27 459.0 464.6 17966998 2021 9
4 2021-09-24 461.4 460.2 16656914 2021 9
对列重命名
# df.columns = ['D','O','H','L','C','V','Y','M']
df.rename(columns={'Date':'D'},inplace=True)
print(df.head(5))
D Open High Low Close Volume Year Month
0 2021-09-30 456.0 464.6 453.8 461.4 17335451 2021 9
1 2021-09-29 461.6 465.0 450.2 465.0 18250450 2021 9
2 2021-09-28 467.0 476.2 464.6 469.8 20947276 2021 9
3 2021-09-27 459.0 473.0 455.2 464.6 17966998 2021 9
4 2021-09-24 461.4 473.4 456.2 460.2 16656914 2021 9
13.电信用户流失数据集
a.计算缺失列
print(df.isnull()) # 应用到所有
print(df.isnull().sum()) #计算每列缺失的个数
b.填充空白值并修改列类型
median = df["TotalCharges"][df["TotalCharges"] != " "].median() # 获取中位数
df.loc[df["TotalCharges"] == " ","TotalCharges"] = median
df["TotalCharges"] = df["TotalCharges"].astype(float)
print(df["TotalCharges"].value_counts())
c.多维度统计月费
print(df.groupby(["Churn","PaymentMethod"])["MonthlyCharges"].mean())

d.某一个字段的数据映射
df["Churn"] = df["Churn"].map({"Yes": 1, "No": 0})
e.相关性矩阵
print(df.corr()) # 只计算数据列
f.随机采样
print(df.sample(10)) # 随机取10行
14.合并Series到DF
np.random.seed(66)
s1 = pd.Series(np.random.rand(20)) # 随机20个[0-1]之间的数
s2 = pd.Series(np.random.randn(20)) #正态随机20个数
df = pd.concat([s1,s2],axis=1) # 按列拼接
df.columns = ['col1','col2']
print(df)
15.多条件筛选DF
print(df[(df['col2'] >=0)] & (df['col1'] <=1) )
16.根据以有列计算新列
df['col3'] = df['col2'].map(lambda x: 1 if x>=0 else -1)
17.根据现有列截断列
df['col4'] = df['col2'].clip(-1.0,1.0)
#如果值.0则值等于-1.0 如果值>1.0 则值等于1.0
18.数列最大和最小的5个数
print(df['col2'].nlargest(5))
print(df['col2'].nsmallest(5))
19.对列累积求和(求前缀和)
print(df.cumsum())
20.计算某一列的中位数
print(df['col2'].median()) #中位数
print(df['col1'].quantile()) #默认返回50%的中位数
21.使用query筛选数据

print(df.query('col2 > 0'))
22.数据前几行变成字典
print(df.head(5).to_dict())
23.数据前几行变成Html
print(df.head(5).to_html())
更多推荐
所有评论(0)