嘿,数据科学的探险家们!欢迎回到Pandas的奇幻都市。今天我们继续我们的冒险之旅,探索更多Pandas的神奇功能。准备好你的数据背包,咱们继续出发吧!
拼接:数据的扩建工程
在Pandas的都市里,拼接数据就像是给你的数据大厦做扩建,让它变得更大更强。
.concat([df1, df2])
-
axis:指出在哪个坐标轴的方向上进行拼接。可取的值为
0/index,1/columns,默认为 0。 -
join:指出拼接的方式,可取的值为
inner交集(多的舍弃),outer合集(多的列/行不舍弃),默认为outer。 -
ignore_index:指出是否使用拼接轴上的索引,可取的值为
False、True,默认为 False。当为 False 时,表示使用拼接轴上的索引;当为 True 时,表示不使用拼接轴上的索引,而是自动生成的索引。
.merge()
-
pd.merge(df1, df2, on='name'#键, how='left'#链接方式,suffixes=('_left', '_right')#重名的标题指定后缀)
-
链接方式:默认inner ,多对多产生的是笛卡儿积
练剑建在index中,可以使用left_index=true right_index=true
df1 = pd.DataFrame({'name': ['Bob', 'Bob', 'Alice', 'Charlie', 'Alice', 'Alice', 'Bob'],
'score1': [97, 92, 88, 98, 86, 99, 94]})
df2 = pd.DataFrame({'score2': [96, 82, 97]}, index=['Alice', 'Bob', 'Deniel'])
print(df1)
print(df2)
print(pd.merge(df1, df2, left_on='name', right_index=True))
分组:数据的行军方队
在Pandas的都市里,分组操作就像是数据的行军方队。你可以根据某个或多个关键字对数据进行分组,然后对每个分组进行操作。
df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})
print(df)
#根据Team分组,多关键字分组:["Team", "Position"]
gk = df.groupby("Team")
print(gk.groups)#{'Bulls': [2, 3], 'Lakers': [0, 1, 4]}
#循环开具体分组
for name, grp in gk:
print(name)#组名 #Bulls
print(grp)#单组 # Team Position Age Weight
2 Bulls SF 24 225
3 Bulls PG 27 190
#获得单个组
gk.get_group("Bulls")
你还可以对每个分组进行计算,比如求平均值。
#计算
gk.mean()#算平均
gk['Age'].mean()#每组Age的平均值
#自定义函数 agg()包裹
def peak_to_peak(arr):
return arr.max() - arr.min()
gk[['Age', 'Weight']].agg(peak_to_peak)
重塑层次化索引:数据的行列转换
在Pandas的都市里,重塑层次化索引就像是数据的行列转换。你可以用stack和unstack来旋转数据的行和列。
df = pd.DataFrame(np.array([[16.0, 23.2, 12.1],
[16.8, 24.6, 14.0],
[14.7, 23.8, 16.6]]),
index=pd.Index(['10/1/2020', '10/2/2020', '10/3/2020'], name='day'),
columns=pd.Index(['Beijing', 'Shanghai', 'Berlin'], name='temp'))
unstack_df = df.unstack('temp')#根据name为temp的翻转
stack_df = unstack_df.stack(dropna=False)#不忽略NaN
透视表:数据的多维分析
透视表就像是数据的多维分析工具。你可以用pivot_table来对数据进行分组、聚合和计算。
# 以key1分组 , 针对key2的值操作 , aggfunc运算方法 , 以key3为索引->列分组
.pivot_table(index=['key1'],values=['key2'], aggfunc='sum',columns=['key3'])
#运算方法的值也可以是一个字典
aggfunc={'Temperature': ['sum', 'mean', 'count']}值也可以是一个字典
.pivot_tabel方法默认对数字列做平均操作。
时间序列:数据的时间旅行
在Pandas的都市里,时间序列就像是数据的时间旅行。你可以用时间戳作为索引,对数据进行切片、移动、时区处理和频率转换。
# 一维数据:以时间戳为index;可切片
ts['2021-08-09':'2021-08-11']
# 生成固定频率的date数据
pd.date_range('2021-08-09', '2021-08-12')
#只有开始或者结束时:periods表示时间段
pd.date_range(end='2021-08-12', periods=4)
#freq指定频率
pd.date_range(start='2021-08-12', periods=4, freq='1H30MIN')
# WOM-3FRI每月第三个星期五
pd.date_range(start='2021-08-12', periods=4, freq='WOM-3FRI')
# 移动数据,值可为负
ts.shift(2)
# 时区处理
ts.tz_localize('UTC').tz_convert('Asia/Shanghai')
# 改变频率,label:起始位置为左或者右。closed:封闭位置为左或者右
ts.resample('2H',label='right',closed='right').sum()
ts.asfreq('2H')
ts.ffill()#对缺失值填充
文件读写:数据的搬运工
在Pandas的都市里,文件读写就像是数据的搬运工。你可以用read_csv和to_csv来读取和写入csv文件。
# 读取csv文件
pd.read_csv('top10_points2.csv', header=None, #对缺失值的默认赋值
names=['PLAYER','POSITION','TEAM','POINTS'])#明确指定列/列索引
, skiprows=[0, 2, 3]#忽略0,2,3行
#NaN缺失:空字符串,NA,NULL
, na_values=['PG']#指定'PG'为缺失值,={'POSITION':'PG', 'AGE':27}可传字典
, nrows=3#读取到第三行
, chunksize=2#两行为一块)
# 写入csv文件
df = pd.read_csv('top10_points.csv')#读取
df.to_csv('out.csv',index=False#忽略索引
,header=False#忽略列索引
,columns=['PLAYER','POSITION', 'TEAM', 'POINTS']#写一部分的列
)
结语
从拼接数据的扩建工程到分组数据的行军方队,从重塑层次化索引的行列转换到透视表的多维分析,从时间序列的时间旅行到文件读写的数据搬运工,我们的奇幻冒险之旅到这里就告一段落了。希望这篇文章能让你在Pandas的世界里找到自己的方向,成为数据处理的大佬。祝你好运,数据科学的探险家们!