V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanqieipnet
V2EX  ›  推广

如何利用 Pandas 实现行对齐和列对齐?

  •  
  •   fanqieipnet · 2020-12-11 17:02:27 +08:00 · 547 次点击
    这是一个创建于 1251 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Pandas 使用行索引和列标签表达和分析数据,分别对应 axis=0, axis=1,行索引、列标签带来一些便捷的功能。那么如何利用 Pandas 实现行对齐和列对齐?今天番茄加速就来讲一下。

      如果玩 Pandas,还没有注意到对齐 alignment,这个特性,那该好好看看接下来的分析。

      基于行索引的对齐,与基于列标签的对齐,原理是一致的,它们其实相当于字典的 key,起到对齐数据作用。但是,这种说法抽象了些,没有例子不好想象出对齐的作用。

      下面使用 google app store 重点分析“行对齐”功能,理解它后,列对齐也自然理解。

      导入包:

       import pandas as pd

       import numpy as np

       import matplotlib.pyplot as plt

       import seaborn as sns

      版本号:

       print(pd.__version__)

       print(np.__version__)

       print(sns.__version__)

       1.0.1

       1.18.1

       0.11.0

      导入数据:

       df = pd.read_csv('kaggle-data/googleplaystore.csv')

       df.head(3)

      图片

      剔除一些异常数据后得到 df_normal,根据 Rating 为每个 app 排名

       rank = df_normal.Rating.rank(method='min',na_option='bottom',ascending=False)

       rank.head(3)

       method 参数指定:Rating 值相等时排名取小,na_option 指定空值排到最后,ascending 指定倒序

      将上面得到的新列 rank 插入 df_normal 中:

       df_normal.insert(2,'rank', rank, allow_duplicates=True)

       df_normal.head(3)

      因为 df_normal 和 rank 的行索引 index 都是从 0 开始的自增,所以即便没有自动对齐,也是准确的:

      但是,你看下面的情况,自动对齐的方便性就能显示出来

      根据 Reviews 列排序

      ### 根据 Reviews 次数从少到多排序

       df_by_reviews = df_normal.sort_values(by='Reviews')

       df_by_reviews.head(3)

      得到 df_by_reviews,注意它的 index 不是按照从 0 自增

      图片

      此时在 df_by_reviews 中,插入 rank 还能确保数据对齐吗

      ### 此时插入排名 rank 列,数据会自动对其

       df_by_reviews.insert(3,'rank_copy',rank)

       df_by_reviews.head()

      看到 rank 列 和 rank_copy 列相等,通过下面一行代码验证出来:

       len( df_by_reviews[ df_by_reviews['rank'] == df_by_reviews['rank_copy'] ]) == len(df_by_reviews)

      由此可见,Pandas 已经为数据自动对齐。

      但是,如果 rank 的 index 某些索引值没有出现在 df_by_reviews 中, 此时又会怎么对齐呢?

      ### 如果后者 index 序列中某些值没有出现在 df_by_reviews 的 index 中

      ### 举个例子

       df_test = pd.DataFrame({'a':[1,4,7],'b':[5,2,1]},index=[4,3,1])

       ser = pd.Series(index=[3,2,1],data=[0,9,8])

      结果 ser 索引值 2 在 df_test 中找不到对应,故为 NaN

      以上就是 Pandas 数据对齐的一个基本介绍,知道这些基本原理后再去使用 Pandas 做数据分析,心里才会更有谱。
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3407 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 762ms · UTC 12:15 · PVG 20:15 · LAX 05:15 · JFK 08:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.