在语法上模拟tidyr r包的包
tidypython的Python项目详细描述
tidypython
-一个简单的python包,设计成在语法上模拟r中的tidyr包。
使用pip安装软件包:
pip install tidypython
使用以下命令将函数加载到脚本中:
from tidypython import *
然后您将可以访问以下功能:
gather(*args, **kwargs)
spread(*args, **kwargs)
separate(*args, **kwargs)
语法被设计成尽可能类似于r包tidyr
。
所有的功能还没有完全实现,但是基本的功能已经实现了。
所有这些函数都设计为与dplython
包运算符>>
一起工作。
此软件包目前正在开发中,如果您想提供以下内容,请访问github页面: https://github.com/durrantmm/tidypython
示例
首先,导入dplython包:
from dplython import *
确保数据帧是DplyFrame对象你可以打电话给:
df = DplyFrame(df)
或者您可以使用readpy
包直接读取文件:
from readpy import *
df = read_tsv("myfile.tsv")
gather()
gather()
命令使用tidyr
语法实现pandasmelt()
函数。
您可以使用gather
命令作为:
df >> gather(X.key, X.value, X.column1, X.column2...)
X.key
和X.value
用于确定将创建的键列和值列的新名称
默认情况下,这将使用column1、column2和所有其他后续列来确定键和值。全部 未指定的列将简单地用作索引或者,也可以使用语法
df >> gather(X.key, X.value, X.column1, X.column2, exclude=True)
这将使column1和column2成为索引,所有其他未指定的列将用于键和值 柱。
以mtcars
数据为例:
>>> mtcars = read_tsv('mtcars.tsv')
>>> print(mtcars >> head())
name mpg cyl disp hp drat wt qsec vs am gear carb
0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
让我们首先通过包含来收集所有感兴趣的列:
>>> mtcars_gathered_inclusion = mtcars >> \
... gather(X.info, X.val, X.mpg, X.cyl, X.disp, X.hp, X.drat, X.wt, X.qsec, X.vs, X.am, X.gear, X.carb))
>>> print(mtcars_gathered_inclusion >> head())
name info val
0 Mazda RX4 mpg 21.0
1 Mazda RX4 Wag mpg 21.0
2 Datsun 710 mpg 22.8
3 Hornet 4 Drive mpg 21.4
4 Hornet Sportabout mpg 18.7
>>> print(mtcars_gathered_inclusion >> tail())
name info val
347 Lotus Europa carb 2.0
348 Ford Pantera L carb 4.0
349 Ferrari Dino carb 6.0
350 Maserati Bora carb 8.0
351 Volvo 142E carb 2.0
现在我们可以通过排除来实现,在这种情况下,排除要短得多:
>>> mtcars_gathered_exclusion = mtcars >> \
... gather(X.info, X.val, X.name, exclude=True))
>>> print(mtcars_gathered_exclusion >> head())
name info val
0 Mazda RX4 mpg 21.0
1 Mazda RX4 Wag mpg 21.0
2 Datsun 710 mpg 22.8
3 Hornet 4 Drive mpg 21.4
4 Hornet Sportabout mpg 18.7
>>> print(mtcars_gathered_exclusion >> tail())
name info val
347 Lotus Europa carb 2.0
348 Ford Pantera L carb 4.0
349 Ferrari Dino carb 6.0
350 Maserati Bora carb 8.0
351 Volvo 142E carb 2.0
您可以看到,它的功能非常类似于tidyr::gather
函数。
spread()
spread()
命令使用tidyr
语法实现pandaspivot()
函数。
可以将spread
命令用作:
df >> spread(X.key, X.value)
^ {CD11>}和^ {< CD12>}用于指定已旋转的现有列,并且所有其他未使用的列都是 假设是索引。
这将使column1和column2成为索引,所有其他未指定的列将用于键和值 柱。
以mtcars
数据为例:
>>> mtcars = read_tsv('mtcars.tsv')
>>> print(mtcars >> head())
name mpg cyl disp hp drat wt qsec vs am gear carb
0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
首先让我们通过排除来收集所有感兴趣的列:
>>> mtcars_gathered_exclusion = mtcars >> \
... gather(X.info, X.val, X.name, exclude=True))
>>> print(mtcars_gathered_exclusion >> head())
name info val
0 Mazda RX4 mpg 21.0
1 Mazda RX4 Wag mpg 21.0
2 Datsun 710 mpg 22.8
3 Hornet 4 Drive mpg 21.4
4 Hornet Sportabout mpg 18.7
然后,我们可以通过使用spread
函数将info
和val
列旋转出来:
>>> print(mtcars_gathered_exclusion >> spread(X.info, X.val) >> head())
name mpg cyl disp hp drat wt qsec vs am gear carb
0 AMC Javelin 15.2 8.0 304.0 150.0 3.15 3.435 17.30 0.0 0.0 3.0 2.0
1 Cadillac Fleetwood 10.4 8.0 472.0 205.0 2.93 5.250 17.98 0.0 0.0 3.0 4.0
2 Camaro Z28 13.3 8.0 350.0 245.0 3.73 3.840 15.41 0.0 0.0 3.0 4.0
3 Chrysler Imperial 14.7 8.0 440.0 230.0 3.23 5.345 17.42 0.0 0.0 3.0 4.0
4 Datsun 710 22.8 4.0 108.0 93.0 3.85 2.320 18.61 1.0 1.0 4.0 1.0
您可以看到,它的功能非常类似于tidyr::gather
函数按照目前的执行情况,
列的顺序将在python>;=3.6中保留,但索引的顺序不会保留。
separate()
separate()
命令在我知道的其他python包中没有直接并行。
您可以使用separate
命令作为:
df >> separate(X.column, into, sep=myseperator)
X.column
是要拆分的列,into
是拆分列的新列名列表,
sep
是用于拆分X.column的正则表达式默认情况下,这将被[^\w]+
分割
假设我们的mtcars数据帧只包含一个由 分隔符“”:
>>> print(mtcars_messy >> head())
name
0 Mazda RX4|21.0|6
1 Mazda RX4 Wag|1.0|6
2 Datsun 710|22.8|4
3 Hornet 4 Drive|21.4|6
4 Hornet Sportabout|18.7|8
您可以使用以下命令将此列分为三列:
>>> mtcars_clean = mtcars_messy >> separate(X.name, ['name', 'mpg', 'cyl'], sep='\|')
>>> print(mtcars_clean >> head())
name mpg cyl
0 Mazda RX4 21.0 6
1 Mazda RX4 Wag 21.0 6
2 Datsun 710 22.8 4
3 Hornet 4 Drive 21.4 6
4 Hornet Sportabout 18.7 8
请注意,所有列在分隔后仍为字符串如果这个号码 指定的列数与拆分后的字符串数不匹配。