DataFrame高阶操作:如何进行行列转换

DataFrame高阶操作:如何进行行列转换

2023年6月29日发(作者:)

DataFrame⾼阶操作:如何进⾏⾏列转换转⾃ Pandas与数据整理在 Tidy Data 论⽂中,Wickham 博⼠ 提出了这样⼀种“整洁”的数据结构:每个变量是⼀列,每次观测结果是⼀⾏,不同的观测类型存放在单独的表中。他认为这样的数据结构可以帮助分析师更简单⾼效地进⾏处理、建模、和可视化。他在论⽂中列举了 五种 不符合整洁数据的情况,并演⽰了如何通过 R 语⾔ 对它们进⾏整理。本⽂中,我们将使⽤ Python 和 Pandas 来达到同样的⽬的。⽂中的源代码和演⽰数据可以在 GitHub(链接)上找到。读者应该已经安装好 Python 开发环境,推荐各位使⽤ Anaconda 和 Spyder IDE。列名称是数据值,⽽⾮变量名import pandas as pddf = _csv('data/')(10)表中的列“<10-20k”其实是“收⼊”变量的具体值。变量 是指某⼀特性的观测值,如⾝⾼、体重,本例中则是收⼊、宗教信仰。表中的数值数据构成了另⼀个变量——⼈数。要做到 每个变量是⼀列 ,我们需要进⾏以下变换:df = _index('religion')df = () = ('income', level=1) = 'frequency'df = _index()(10)这⾥我们使⽤了 Pandas 多级索引的 stack / unstack 特性。stack() 会将列名转置为新⼀级的索引,并将数据框(DataFrame)转换成序列(Series)。转置后,我们对⾏和列的名称做⼀些调整,再⽤ reset_index() 将数据框还原成普通的⼆维表。除了使⽤多级索引,Pandas 还提供了另⼀种更为便捷的⽅法——melt()。该⽅法接收以下参数:frame: 需要处理的数据框;id_vars: 保持原样的数据列;value_vars: 需要被转换成变量值的数据列;var_name: 转换后变量的列名;value_name: 数值变量的列名。df = _csv('data/')df = (df, id_vars=['religion'], value_vars=list(s)[1:], var_name='income', value_name='frequency')df = _values(by='religion')_csv('data/', index=False)(10)这段代码会输出相同的结果,下⾯的⽰例中我们都将使⽤ melt() ⽅法。我们再来看另外⼀个案例:在这个数据集中,每周的排名都被记录到了不同的数据列中。如果我们想要回答“Dancing Queen 这⾸歌在 2000年7⽉15⽇ 的排名如何”,就需要结合 d 字段做⼀些运算才⾏。下⾯我们来对这份数据进⾏整理:df = _csv('data/')df = (df, id_vars=list(s)[:5], value_vars=list(s)[5:], var_name='week', value_name='rank')df['week'] = df['week'].str[2:].astype(int)df['d'] = _datetime(df['d']) + _timedelta((df['week'] - 1) * 7, 'd')df = (columns={'d': 'date'})df = _values(by=['track', 'date'])_csv('data/', index=False)(10)上述代码中,我们还将 d 转换成了每⼀周的具体⽇期,week 字段也作为单独的数据列进⾏存储。但是,我们会在表中看到很多重复的信息,如歌⼿、曲名等,我们将在第四节解决这个问题。⼀列包含多个变量⼈们之所以会将变量值作为列名,⼀⽅⾯是这样的表⽰⽅法更为紧凑、可以在⼀页中显⽰更多信息,还有⼀点是这种格式便于做交叉验证等数据分析⼯作。下⾯的数据集更是将性别和年龄这两个变量都放⼊了列名中: 表⽰男性(Male),f 表⽰⼥性(Female),0-14、15-24 则表⽰年龄段。进⾏数据整理时,我们先⽤ Pandas 的字符串处理功能截取 sex字段,再对剩余表⽰年龄段的⼦串做映射处理。df = _csv('data/')df = (df, id_vars=['country', 'year'], value_vars=list(s)[2:], var_name='column', value_name='cases')df = df[df['cases'] != '---']df['cases'] = df['cases'].astype(int)df['sex'] = df['column'].str[0]df['age'] = df['column'].str[1:].map({ '014': '0-14', '1524': '15-24', '2534': '25-34', '3544': '35-44', '4554': '45-54', '5564': '55-64', '65': '65+'})df = df[['country', 'year', 'sex', 'age', 'cases']]_csv('data/', index=False)(10)变量存储在⾏和列中下表是⼀个名为 MX17004 的⽓象站收集的温度数据。可以看到,⽇期被放置在列名中,我们可以⽤ melt 进⾏处理;tmax 和 tmin 则表⽰最⾼温度和最低温度,他们很显然是两个不同的变量,⽤来衡量单个观测对象的属性的,本例中的观测对象是“天”。因此,我们需要使⽤unstack 将其拆分成两列。 = _csv('data/')df = (df, id_vars=['id', 'year', 'month', 'element'], value_vars=list(s)[4:], var_name='date', value_name='value')df['date'] = df['date'].str[1:].astype('int')df['date'] = df[['year', 'month', 'date']].apply( lambda row: '{:4d}-{:02d}-{:02d}'.format(*row), axis=1)df = [df['value'] != '---', ['id', 'date', 'element', 'value']]df = _index(['id', 'date', 'element'])df = k()s = list(_level_values('element'))df = _index()_csv('data/', index=False)同⼀表中包含多种观测类型在处理 Billboard 数据集时,我们会看到冗余的曲⽬信息,这是因为该表实际记录的是两种不同的观测类型——歌曲曲⽬和周排名。整理时,我们需要先为每⾸歌曲⽣成⼀个唯⼀标识,即 id,然后拆分到单独的表中。df = _csv('data/')df_track = df[['artist', 'track', 'time']].drop_duplicates()df_(0, 'id', range(1, len(df_track) + 1))df = (df, df_track, on=['artist', 'track', 'time'])df = df[['id', 'date', 'rank']]df__csv('data/', index=False)_csv('data/', index=False)print(df_track, 'nn', df)同⼀观测类型分布在不同表中原始的数据集可能会以两种⽅式进⾏了拆分,⼀种是按照某个变量拆分,如按年拆分为2000年、2001年,按地理位置拆分为中国、英国;另⼀种是按不同的属性拆分,如⼀份数据是收集温度的传感器记录的,另⼀份是湿度传感器,他们记录的都是每⼀天的观测值。对于第⼀种情况,我们可以编写⼀个读取数据的函数,遍历⽬录中的⽂件,并将⽂件名作为单独的列加⼊数据框,最后使⽤ 进⾏合并;第⼆种情况则要求数据集中的记录有⼀个唯⼀标识,如⽇期、⾝份证号,并通过 将各个数据集联系起来。参考资料/tps:///reshaping-data-in-python-fa27dda2ff77/

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687978234a62964.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信