Pandas的奇幻都市:数据科学的冒险之旅(续篇)

56 阅读5分钟

嘿,数据科学的探险家们!欢迎回到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 ,多对多产生的是笛卡儿积

1748490251433.png

练剑建在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的世界里找到自己的方向,成为数据处理的大佬。祝你好运,数据科学的探险家们!