大数据分析、底层架构、设计思路,本文作者(大数据分析师——廉小宝)带你探路。 —— 23号老板
原创:a廉小宝
Python安装:直接安装Anaconda环境可以方便很多,Anaconda内置了很多Python包,使用起来很方便,另外推荐使用Python3版本,Python2目前已经停更。
推荐工具:一些小的实验可以在Jupyter Notebook上进行,工程项目可以使用Pycharm,方便调试 。 安装链接
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:
Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。
计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
字符串是以单引号’或双引号"括起来的任意文本,比如’abc’,“xyz"等等。请注意,’'或”“本身只是一种表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c这3个字符。如果’本身也是一个字符,那就可以用”"括起来,比如"I’m OK"包含的字符是I,’,m,空格,O,K这6个字符。
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
比如,一列数字,就可以用一个list表示:
a = [1,2,3,4,5]
print(a)
用索引来访问list中每一个位置的元素,记得索引是从0开始的:
print(a[0])
print(a[1:3])
记住list的索引范围是0:len(list)。
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
a = (1, 2, 3, 4, 5)
print(a)
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
a = dict(zip(names, scores))
dict也可以通过直接命名的方式定义,更为直接:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Bob']
通过检索dict的key可以直接访问其对应的value。
dict可以存储不同类型的数据,这是和前面的list和tuple完全不同的地方。
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
重复元素在set中自动被过滤:
s = set([1, 1, 2, 2, 3, 3])
s
Pandas 是一个 Python 的包,提供快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观。它旨在成为在Python中进行实际,真实世界数据分析的基础高级构建模块。此外,它还有更宏远的目标,即成为超过任何语言的最强大,最灵活的开源数据分析/操作工具。它已朝着这个目标迈进。
pandas非常适合许多不同类型的数据:
Pandas 的两个主要数据结构,Series(1维)和DataFrame(2维),处理金融,统计,社会科学和许多工程领域中的绝大多数典型用例。对于R用户,DataFrame提供R的data.frame提供的所有内容以及更多内容。Pandas建立在NumPy之上,旨在与许多其他第三方库完美地集成在科学计算环境中。
以下是Pandas做够胜任的一些事情:
其中许多技术都是为了解决使用其他语言/科研环境时经常遇到的缺点。对于数据科学家来说,处理数据通常分为多个阶段:整理和清理数据,分析/建模数据,然后将分析结果组织成适合绘图或表格显示的形式。Pandas 是完成所有这些任务的理想工具。
import pandas as pd
import numpy as np
通过传入一些值的列表来创建一个Series,Pandas会自动创建一个默认的整数索引:
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
通过传递带有日期时间索引和带标签列的NumPy数组来创建DataFrame:
dates = pd.date_range('20190725', periods=6)
dates
DatetimeIndex(['2019-07-25', '2019-07-26', '2019-07-27', '2019-07-28',
'2019-07-29', '2019-07-30'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.rand(6,4),index=dates, columns=list('ABCD'))
df
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.030035 | 0.364846 | 0.385114 | 0.892197 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
通过传递可以转化为类似Series的dict对象来创建DataFrame:
df2 = pd.DataFrame({
'A': 1.,
'B': pd.Timestamp('20190722'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E':pd.Categorical(["Luffy","Zoro","Nami","Robin"]),
'F':'onepice'
})
df2
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1.0 | 2019-07-22 | 1.0 | 3 | Luffy | onepice |
1 | 1.0 | 2019-07-22 | 1.0 | 3 | Zoro | onepice |
2 | 1.0 | 2019-07-22 | 1.0 | 3 | Nami | onepice |
3 | 1.0 | 2019-07-22 | 1.0 | 3 | Robin | onepice |
df.head() # 查看起始的几个
df.tail() # 查看末尾的几个
A | B | C | D | |
---|---|---|---|---|
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
df.index
DatetimeIndex(['2019-07-25', '2019-07-26', '2019-07-27', '2019-07-28',
'2019-07-29', '2019-07-30'],
dtype='datetime64[ns]', freq='D')
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
df.describe()
A | B | C | D | |
---|---|---|---|---|
count | 6.000000 | 6.000000 | 6.000000 | 6.000000 |
mean | 0.457071 | 0.533592 | 0.533551 | 0.602658 |
std | 0.385674 | 0.340186 | 0.182570 | 0.327549 |
min | 0.030035 | 0.143410 | 0.385114 | 0.084260 |
25% | 0.119012 | 0.321800 | 0.420294 | 0.451127 |
50% | 0.452824 | 0.426720 | 0.469652 | 0.623721 |
75% | 0.782250 | 0.825356 | 0.565715 | 0.852836 |
max | 0.906944 | 0.959643 | 0.875313 | 0.961442 |
df.to_dict
<bound method DataFrame.to_dict of A B C D
2019-07-25 0.030035 0.364846 0.385114 0.892197
2019-07-26 0.264333 0.959643 0.418979 0.512688
2019-07-27 0.829229 0.488593 0.424240 0.734755
2019-07-28 0.641315 0.307451 0.582599 0.084260
2019-07-29 0.070572 0.937610 0.515065 0.961442
2019-07-30 0.906944 0.143410 0.875313 0.430607>
df.sort_index(axis=1,ascending=False)
D | C | B | A | |
---|---|---|---|---|
2019-07-25 | 0.892197 | 0.385114 | 0.364846 | 0.030035 |
2019-07-26 | 0.512688 | 0.418979 | 0.959643 | 0.264333 |
2019-07-27 | 0.734755 | 0.424240 | 0.488593 | 0.829229 |
2019-07-28 | 0.084260 | 0.582599 | 0.307451 | 0.641315 |
2019-07-29 | 0.961442 | 0.515065 | 0.937610 | 0.070572 |
2019-07-30 | 0.430607 | 0.875313 | 0.143410 | 0.906944 |
df.sort_values(by='C')
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.030035 | 0.364846 | 0.385114 | 0.892197 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
选择一个column:df[‘A’]或者df.A
Sorting by values:
.loc() 具有多种访问方式,如 -
loc需要两个单/列表/范围运算符,用","分隔。第一个表示行,第二个表示列
df.loc[dates[0]]
A 0.030035
B 0.364846
C 0.385114
D 0.892197
Name: 2019-07-25 00:00:00, dtype: float64
df.loc[:,['A','B']]
A | B | |
---|---|---|
2019-07-25 | 0.030035 | 0.364846 |
2019-07-26 | 0.264333 | 0.959643 |
2019-07-27 | 0.829229 | 0.488593 |
2019-07-28 | 0.641315 | 0.307451 |
2019-07-29 | 0.070572 | 0.937610 |
2019-07-30 | 0.906944 | 0.143410 |
df.loc['20190726':'20190728',['A','B']]
A | B | |
---|---|---|
2019-07-26 | 0.264333 | 0.959643 |
2019-07-27 | 0.829229 | 0.488593 |
2019-07-28 | 0.641315 | 0.307451 |
.iloc()各种访问方式如下 -
df.iloc[[1,2,4],[0,2]]
A | C | |
---|---|---|
2019-07-26 | 0.264333 | 0.418979 |
2019-07-27 | 0.829229 | 0.424240 |
2019-07-29 | 0.070572 | 0.515065 |
df.iloc[1:3,:]
A | B | C | D | |
---|---|---|---|---|
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
df.iloc[:,1:3]
B | C | |
---|---|---|
2019-07-25 | 0.364846 | 0.385114 |
2019-07-26 | 0.959643 | 0.418979 |
2019-07-27 | 0.488593 | 0.424240 |
2019-07-28 | 0.307451 | 0.582599 |
2019-07-29 | 0.937610 | 0.515065 |
2019-07-30 | 0.143410 | 0.875313 |
使用一个column的值去选择数据:
df[df.A>0]
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.030035 | 0.364846 | 0.385114 | 0.892197 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
df[df>0]
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.030035 | 0.364846 | 0.385114 | 0.892197 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
通过label设置value:
df.at[dates[0], 'A'] = 0
df
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.000000 | 0.364846 | 0.385114 | 0.892197 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
通过位置设置value:
df.iat[0,1] = 0
df
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.000000 | 0.000000 | 0.385114 | 0.892197 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 0.512688 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 0.734755 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 0.084260 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 0.961442 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 0.430607 |
通过numpy数组来设置:
df.loc[:, 'D'] = np.array([5] * len(df))
df
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.000000 | 0.000000 | 0.385114 | 5 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 5 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 5 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 5 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 5 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 5 |
删除缺失数据
df.dropna(how='any')
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.000000 | 0.000000 | 0.385114 | 5 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 5 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 5 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 5 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 5 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 5 |
填充/替换缺失数据
df.fillna(value=10)
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.000000 | 0.000000 | 0.385114 | 5 |
2019-07-26 | 0.264333 | 0.959643 | 0.418979 | 5 |
2019-07-27 | 0.829229 | 0.488593 | 0.424240 | 5 |
2019-07-28 | 0.641315 | 0.307451 | 0.582599 | 5 |
2019-07-29 | 0.070572 | 0.937610 | 0.515065 | 5 |
2019-07-30 | 0.906944 | 0.143410 | 0.875313 | 5 |
判断是否有缺失值数据
pd.isna(df)
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | False | False | False | False |
2019-07-26 | False | False | False | False |
2019-07-27 | False | False | False | False |
2019-07-28 | False | False | False | False |
2019-07-29 | False | False | False | False |
2019-07-30 | False | False | False | False |
df.apply(np.cumsum)
A | B | C | D | |
---|---|---|---|---|
2019-07-25 | 0.000000 | 0.000000 | 0.385114 | 5 |
2019-07-26 | 0.264333 | 0.959643 | 0.804092 | 10 |
2019-07-27 | 1.093562 | 1.448236 | 1.228332 | 15 |
2019-07-28 | 1.734877 | 1.755688 | 1.810931 | 20 |
2019-07-29 | 1.805448 | 2.693298 | 2.325995 | 25 |
2019-07-30 | 2.712393 | 2.836708 | 3.201309 | 30 |
df.apply(lambda x: x.max() - x.min())
A 0.906944
B 0.959643
C 0.490200
D 0.000000
dtype: float64
s = pd.Series(np.random.randint(0, 7, size=10))
s
0 3
1 3
2 4
3 4
4 2
5 2
6 0
7 6
8 4
9 5
dtype: int64
s.value_counts()
3 4
4 3
5 2
2 1
dtype: int64
concat:
df3 = pd.DataFrame(np.random.randn(10, 4))
df3
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.546509 | -0.645993 | 1.569857 | -0.059439 |
1 | 3.143148 | -0.357604 | -0.610698 | -1.032072 |
2 | -0.593522 | 0.453311 | 0.033460 | -1.163151 |
3 | 0.222209 | 0.542827 | 1.220938 | 0.540577 |
4 | 0.770124 | -1.044302 | -0.684126 | 0.990673 |
5 | -0.324735 | 1.688151 | 1.202889 | 0.632073 |
6 | 0.385171 | 1.368965 | -0.049633 | 0.697233 |
7 | 0.428143 | 0.012934 | -0.745038 | -0.570553 |
8 | 0.396524 | 0.804365 | -1.310140 | -0.246317 |
9 | -0.438507 | 0.887196 | 1.272626 | -2.558894 |
pieces = [df3[:3], df3[3:7], df3[7:]]
pieces
[ 0 1 2 3
0 0.546509 -0.645993 1.569857 -0.059439
1 3.143148 -0.357604 -0.610698 -1.032072
2 -0.593522 0.453311 0.033460 -1.163151,
0 1 2 3
3 0.222209 0.542827 1.220938 0.540577
4 0.770124 -1.044302 -0.684126 0.990673
5 -0.324735 1.688151 1.202889 0.632073
6 0.385171 1.368965 -0.049633 0.697233,
0 1 2 3
7 0.428143 0.012934 -0.745038 -0.570553
8 0.396524 0.804365 -1.310140 -0.246317
9 -0.438507 0.887196 1.272626 -2.558894]
pd.concat(pieces)
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.546509 | -0.645993 | 1.569857 | -0.059439 |
1 | 3.143148 | -0.357604 | -0.610698 | -1.032072 |
2 | -0.593522 | 0.453311 | 0.033460 | -1.163151 |
3 | 0.222209 | 0.542827 | 1.220938 | 0.540577 |
4 | 0.770124 | -1.044302 | -0.684126 | 0.990673 |
5 | -0.324735 | 1.688151 | 1.202889 | 0.632073 |
6 | 0.385171 | 1.368965 | -0.049633 | 0.697233 |
7 | 0.428143 | 0.012934 | -0.745038 | -0.570553 |
8 | 0.396524 | 0.804365 | -1.310140 | -0.246317 |
9 | -0.438507 | 0.887196 | 1.272626 | -2.558894 |
merge:
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
left
key | lval | |
---|---|---|
0 | foo | 1 |
1 | foo | 2 |
right
key | rval | |
---|---|---|
0 | foo | 4 |
1 | foo | 5 |
pd.merge(left, right, on='key')
key | lval | rval | |
---|---|---|---|
0 | foo | 1 | 4 |
1 | foo | 1 | 5 |
2 | foo | 2 | 4 |
3 | foo | 2 | 5 |
append:
df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df
A | B | C | D | |
---|---|---|---|---|
0 | -0.580808 | -0.929980 | 0.582348 | -0.535886 |
1 | -1.221695 | -0.739676 | -2.285674 | 1.760386 |
2 | -0.105866 | 0.978615 | 0.793799 | 1.810907 |
3 | -0.244317 | 0.806360 | 0.966249 | 0.662066 |
4 | -0.134750 | -0.596918 | -0.260338 | 0.532753 |
5 | -0.052537 | 1.517903 | -1.092491 | -0.634890 |
6 | 0.751423 | -0.674670 | -0.266553 | -0.247528 |
7 | 0.677052 | -1.403007 | 0.252095 | -1.426274 |
s = df.iloc[4]
s
A -0.134750
B -0.596918
C -0.260338
D 0.532753
Name: 4, dtype: float64
df.append(s, ignore_index=True)
A | B | C | D | |
---|---|---|---|---|
0 | -0.580808 | -0.929980 | 0.582348 | -0.535886 |
1 | -1.221695 | -0.739676 | -2.285674 | 1.760386 |
2 | -0.105866 | 0.978615 | 0.793799 | 1.810907 |
3 | -0.244317 | 0.806360 | 0.966249 | 0.662066 |
4 | -0.134750 | -0.596918 | -0.260338 | 0.532753 |
5 | -0.052537 | 1.517903 | -1.092491 | -0.634890 |
6 | 0.751423 | -0.674670 | -0.266553 | -0.247528 |
7 | 0.677052 | -1.403007 | 0.252095 | -1.426274 |
8 | -0.134750 | -0.596918 | -0.260338 | 0.532753 |
df = pd.DataFrame({'A': ['bao', 'xiao', 'bao', 'xiao',
'bao', 'xiao', 'bao', 'bao'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)
})
df
A | B | C | D | |
---|---|---|---|---|
0 | bao | one | 0.213947 | -0.725881 |
1 | xiao | one | 0.059765 | 0.279252 |
2 | bao | two | 0.331073 | -0.106657 |
3 | xiao | three | -1.168653 | -0.493226 |
4 | bao | two | 1.149379 | 0.214320 |
5 | xiao | two | -0.779205 | -1.242145 |
6 | bao | one | 1.676725 | -1.061910 |
7 | bao | three | -0.085045 | 0.155202 |
df.groupby('A').sum()
C | D | |
---|---|---|
A | ||
bao | 3.286079 | -1.524925 |
xiao | -1.888093 | -1.456119 |
df.to_csv('bao.csv')
pd.read_csv('bao.csv')
Unnamed: 0 | A | B | C | D | |
---|---|---|---|---|---|
0 | 0 | bao | one | 0.213947 | -0.725881 |
1 | 1 | xiao | one | 0.059765 | 0.279252 |
2 | 2 | bao | two | 0.331073 | -0.106657 |
3 | 3 | xiao | three | -1.168653 | -0.493226 |
4 | 4 | bao | two | 1.149379 | 0.214320 |
5 | 5 | xiao | two | -0.779205 | -1.242145 |
6 | 6 | bao | one | 1.676725 | -1.061910 |
7 | 7 | bao | three | -0.085045 | 0.155202 |
df.to_hdf('bao.h5', 'df')
pd.read_hdf('bao.h5', 'df')
A | B | C | D | |
---|---|---|---|---|
0 | bao | one | 0.213947 | -0.725881 |
1 | xiao | one | 0.059765 | 0.279252 |
2 | bao | two | 0.331073 | -0.106657 |
3 | xiao | three | -1.168653 | -0.493226 |
4 | bao | two | 1.149379 | 0.214320 |
5 | xiao | two | -0.779205 | -1.242145 |
6 | bao | one | 1.676725 | -1.061910 |
7 | bao | three | -0.085045 | 0.155202 |
df.to_excel('bao.xlsx', sheet_name='Sheet1')
pd.read_excel('bao.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
A | B | C | D | |
---|---|---|---|---|
0 | bao | one | 0.213947 | -0.725881 |
1 | xiao | one | 0.059765 | 0.279252 |
2 | bao | two | 0.331073 | -0.106657 |
3 | xiao | three | -1.168653 | -0.493226 |
4 | bao | two | 1.149379 | 0.214320 |
5 | xiao | two | -0.779205 | -1.242145 |
6 | bao | one | 1.676725 | -1.061910 |
7 | bao | three | -0.085045 | 0.155202 |