如何利用 Pandas 实现行对齐和列对齐? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanqieipnet
V2EX    推广

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

  •  
  •   fanqieipnet 2020-12-11 17:02:27 +08:00 760 次点击
    这是一个创建于 1847 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     2354 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 11:49 PVG 19:49 LAX 03:49 JFK 06:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86