python数据转置函数 python数据转换函数

Python实现矩阵转置的方法分析Python实现矩阵转置的方法分析
本文实例讲述了Python实现矩阵转置的方法 。分享给大家供大家参考,具体如下:
前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表 , 往原来相应位置添加 。例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再添加[5, 6]扩充为[[1, 3, 5], [2, 4, 6]]等等 。
其实不动脑筋的话,用个二重循环很容易写出来:
def trans(m):
a = [[] for i in m[0]]
for i in m:
for j in range(len(i)):
a[j].append(i[j])
return a
m = [[1, 2], [3, 4], [5, 6]]# 想象第一个列表是原始的,后面的是往里添加的
print trans(m)# result:[[1, 3, 5], [ 2, 4, 6]]
然而不管怎么看这种代码都很丑 。
仔细看了一下m这种结构 。等等,这不是字典的iteritems()的结果么?如果dict(m),那么结果——不就是keys()和values()么?
于是利用字典转换一下:
def trans(m):
d = dict(m)
return [d.keys(), d.values()]
可是再仔细想想 , 这里面有bug 。如果添加列表的第一个元素相同,也就是转化之后dict的key相同,那肯定就不行了呀!况且,如果原始列表不是两个,而是多个,肯定不能用字典的呀!于是这种方法作罢,还是好好看看列表的形状 。
然后又是一个不小心的发现:
这种转置矩阵的即时感是怎么回事?
没错 , 这个问题的本质就是求解转置矩阵 。于是就简单了,还是用个不动脑筋的办法:
def trans(m):
for i in range(len(m)):
for j in range(i):
m[i][j], m[j][i] = m[j][i], m[i][j]
return m
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print trans(m)
其实还是有点bug的,看起来是好用的,然而这个矩阵要求行列长度相同才行 。
最后 , 群里某大神说:如果只是转置矩阵的话 , 直接zip就好了 。这才想起来zip的本质就是这样的 , 取出列表中的对应位置的元素 , 组成新列表,正是这个题目要做的 。
所以最终,这个题目(转置矩阵)的python解法就相当奇妙了:
def trans(m):
return zip(*d)
没错,就这么简单 。python的魅力 。
数据分析员用python做数据分析是怎么回事,需要用到python中的那些内容,具体是怎么操作的?最近,Analysis with Programming加入了Planet Python 。我这里来分享一下如何通过Python来开始数据分析 。具体内容如下:
数据导入
导入本地的或者web端的CSV文件;
数据变换;
数据统计描述;
假设检验
单样本t检验;
可视化;
创建自定义函数 。
数据导入
1
这是很关键的一步 , 为了后续的分析我们首先需要导入数据 。通常来说 , 数据是CSV格式,就算不是,至少也可以转换成CSV格式 。在Python中,我们的操作如下:
import pandas as pd
# Reading data locally
df = pd.read_csv('/Users/al-ahmadgaidasaad/Documents/d.csv')
# Reading data from web
data_url = ""
df = pd.read_csv(data_url)
为了读取本地CSV文件,我们需要pandas这个数据分析库中的相应模块 。其中的read_csv函数能够读取本地和web数据 。
END
数据变换
1
既然在工作空间有了数据,接下来就是数据变换 。统计学家和科学家们通常会在这一步移除分析中的非必要数据 。我们先看看数据(下图)
对R语言程序员来说,上述操作等价于通过print(head(df))来打印数据的前6行,以及通过print(tail(df))来打印数据的后6行 。当然Python中,默认打印是5行,而R则是6行 。因此R的代码head(df, n = 10),在Python中就是df.head(n = 10) , 打印数据尾部也是同样道理
请点击输入图片描述
2
在R语言中,数据列和行的名字通过colnames和rownames来分别进行提取 。在Python中,我们则使用columns和index属性来提取 , 如下:
# Extracting column names
print df.columns
# OUTPUT
Index([u'Abra', u'Apayao', u'Benguet', u'Ifugao', u'Kalinga'], dtype='object')
# Extracting row names or the index
print df.index
# OUTPUT
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78], dtype='int64')
3
数据转置使用T方法 ,
# Transpose data
print df.T
# OUTPUT
0123456789
Abra12434158178717152126655769272154010395424
Apayao2934923519221450123857452109917038138210588
Benguet14842871955353625307712796246325921064
Ifugao33008063107419607331513134513414226684213828
Kalinga1055335257454431687852028252310636238497340140
...697071727374757677
Abra...12763247059094620913316250560303631113345
Apayao...3762519532351266335386132087840065675638902
Benguet...235440455987353025853519706235612583
Ifugao...9838171251894015560774619737194221591011096
Kalinga...657821527952437243856614816513618082334968663
78
Abra2623
Apayao18264
Benguet3745
Ifugao16787
Kalinga16900
Other transformations such as sort can be done using codesort/code attribute. Now let's extract a specific column. In Python, we do it using either codeiloc/code or codeix/code attributes, but codeix/code is more robust and thus I prefer it. Assuming we want the head of the first column of the data, we have
4
其他变换,例如排序就是用sort属性 。现在我们提取特定的某列数据 。Python中,可以使用iloc或者ix属性 。但是我更喜欢用ix,因为它更稳定一些 。假设我们需数据第一列的前5行,我们有:
print df.ix[:, 0].head()
# OUTPUT 01243 14158 21787 317152 41266 Name: Abra, dtype: int64
5
顺便提一下 , Python的索引是从0开始而非1 。为了取出从11到20行的前3列数据,我们有
print df.ix[10:20, 0:3]
# OUTPUT
AbraApayaoBenguet
1098113112560
1127366150933039
12110017012382
137212110011088
14104814272847
1525679156612942
16105521912119
1754376461734
18102911832302
1923710122222598
20109123432654
上述命令相当于df.ix[10:20, ['Abra', 'Apayao', 'Benguet']] 。
6
为了舍弃数据中的列,这里是列1(Apayao)和列2(Benguet),我们使用drop属性,如下:
print df.drop(df.columns[[1, 2]], axis = 1).head()
# OUTPUT
AbraIfugaoKalinga
01243330010553
14158806335257
2178710744544
3171521960731687
4126633158520
axis 参数告诉函数到底舍弃列还是行 。如果axis等于0,那么就舍弃行 。
END
统计描述
1
下一步就是通过describe属性,对数据的统计特性进行描述:
print df.describe()
# OUTPUT
AbraApayaoBenguetIfugaoKalinga
count79.00000079.00000079.00000079.00000079.000000
mean12874.37974716860.6455703237.39240512414.62025330446.417722
std16746.46694515448.1537941588.5364295034.28201922245.707692
min927.000000401.000000148.0000001074.0000002346.000000
2524.0000003435.5000002328.0000008205.0000008601.500000
50W90.00000010588.0000003202.00000013044.00000024494.000000
75330.50000033289.0000003918.50000016099.50000052510.500000
max60303.00000054625.0000008813.00000021031.00000068663.000000
END
假设检验
1
Python有一个很好的统计推断包 。那就是scipy里面的stats 。ttest_1samp实现了单样本t检验 。因此,如果我们想检验数据Abra列的稻谷产量均值 , 通过零假设,这里我们假定总体稻谷产量均值为15000,我们有:
from scipy import stats as ss
# Perform one sample t-test using 1500 as the true mean
print ss.ttest_1samp(a = df.ix[:, 'Abra'], popmean = 15000)
# OUTPUT
(-1.1281738488299586, 0.26270472069109496)
返回下述值组成的元祖:
t : 浮点或数组类型t统计量
prob : 浮点或数组类型two-tailed p-value 双侧概率值
2
通过上面的输出,看到p值是0.267远大于α等于0.05,因此没有充分的证据说平均稻谷产量不是150000 。将这个检验应用到所有的变量,同样假设均值为15000,我们有:
print ss.ttest_1samp(a = df, popmean = 15000)
# OUTPUT
(array([ -1.12817385,1.07053437, -65.81425599,-4.564575,6.17156198]),
array([2.62704721e-01,2.87680340e-01,4.15643528e-70,
1.83764399e-05,2.82461897e-08]))
第一个数组是t统计量,第二个数组则是相应的p值
END
可视化
1
Python中有许多可视化模块,最流行的当属matpalotlib库 。稍加提及,我们也可选择bokeh和seaborn模块 。之前的博文中,我已经说明了matplotlib库中的盒须图模块功能 。
请点击输入图片描述
2
# Import the module for plotting
import matplotlib.pyplot as plt
plt.show(df.plot(kind = 'box'))
现在,我们可以用pandas模块中集成R的ggplot主题来美化图表 。要使用ggplot,我们只需要在上述代码中多加一行,
import matplotlib.pyplot as plt
pd.options.display.mpl_style = 'default' # Sets the plotting display theme to ggplot2
df.plot(kind = 'box')
3
这样我们就得到如下图表:
请点击输入图片描述
4
比matplotlib.pyplot主题简洁太多 。但是在本文中,我更愿意引入seaborn模块,该模块是一个统计数据可视化库 。因此我们有:
# Import the seaborn library
import seaborn as sns
# Do the boxplot
plt.show(sns.boxplot(df, widths = 0.5, color = "pastel"))
请点击输入图片描述
5
多性感的盒式图,继续往下看 。
请点击输入图片描述
6
plt.show(sns.violinplot(df, widths = 0.5, color = "pastel"))
请点击输入图片描述
7
plt.show(sns.distplot(df.ix[:,2], rug = True, bins = 15))
请点击输入图片描述
8
with sns.axes_style("white"):
plt.show(sns.jointplot(df.ix[:,1], df.ix[:,2], kind = "kde"))
【python数据转置函数 python数据转换函数】请点击输入图片描述
9
plt.show(sns.lmplot("Benguet", "Ifugao", df))
END
创建自定义函数
在Python中,我们使用def函数来实现一个自定义函数 。例如,如果我们要定义一个两数相加的函数 , 如下即可:
def add_2int(x, y):
return xy
print add_2int(2, 2)
# OUTPUT
4
顺便说一下,Python中的缩进是很重要的 。通过缩进来定义函数作用域,就像在R语言中使用大括号{…}一样 。这有一个我们之前博文的例子:
产生10个正态分布样本 , 其中和
基于95%的置信度,计算和 ;
重复100次; 然后
计算出置信区间包含真实均值的百分比
Python中,程序如下:
import numpy as np
import scipy.stats as ss
def case(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):
m = np.zeros((rep, 4))
for i in range(rep):
norm = np.random.normal(loc = mu, scale = sigma, size = n)
xbar = np.mean(norm)
low = xbar - ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
up = xbarss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
if (mulow)(muup):
rem = 1
else:
rem = 0
m[i, :] = [xbar, low, up, rem]
inside = np.sum(m[:, 3])
per = inside / rep
desc = "There are "str(inside)" confidence intervals that contain "
"the true mean ("str(mu)"), that is "str(per)" percent of the total CIs"
return {"Matrix": m, "Decision": desc}
上述代码读起来很简单,但是循环的时候就很慢了 。下面针对上述代码进行了改进 , 这多亏了 Python专家
import numpy as np
import scipy.stats as ss
def case2(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):
scaled_crit = ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
norm = np.random.normal(loc = mu, scale = sigma, size = (rep, n))
xbar = norm.mean(1)
low = xbar - scaled_crit
up = xbarscaled_crit
rem = (mulow)(muup)
m = np.c_[xbar, low, up, rem]
inside = np.sum(m[:, 3])
per = inside / rep
desc = "There are "str(inside)" confidence intervals that contain "
"the true mean ("str(mu)"), that is "str(per)" percent of the total CIs"
return {"Matrix": m, "Decision": desc}
python transposetranspose python数据转置函数,可以对矩阵的维度进行转换,下面看一个例子:
在这里做一个简单的假设:这个操作是把每一个维度都当作一个索引python数据转置函数,对应于,
[123]--000
[456]--010------ 所以python数据转置函数我们对变换首先对一个维度进行固定,对另外两个
[789]--101维度进行操作
[101112]--111
[[[ 14]
[ 25]
[ 36]]
这说明假设错误 。
[[ 7 10]
[ 8 11]
[ 9 12]]]
这说明这个炒作本质是对矩阵进行转置 。转置的含义就是沿着数据中心,对数据进行对换 。
参考变换方式:
python中怎样让数据列转置需求:
你需要转置一个二维数组,将行列互换.
讨论:
你需要确保该数组的行列数都是相同的.比如:
arr = [[1, 2, 3], [4, 5, 6], [7,8, 9], [10, 11, 12]]
列表递推式提供了一个简便的矩阵转置的方法:
print [[r[col] for r in arr] for col in range(len(arr[0]))]
[[1, 4, 7, 10], [2, 5, 8, 11],[3, 6, 9, 12]]
另一个更快和高级一些的方法,可以使用zip函数:
print map(list,
zip(*arr))
本节提供了关于矩阵转置的两个方法,一个比较清晰简单,另一个比较快速但有些隐晦.
有时候,数据到来的时候使用错误的方式,比如,你使用微软的ADO接口访问数据库,由于Python和MS在语言实现上的差别.
Getrows方法在Python中可能返回的是列值,和方法的名称不同.本节给的出的方法就是这个问题常见的解决方案,一个更清晰,一个更快速.
在列表递推式版本中,内层递推式表示选则什么(行),外层递推式表示选择者(列).这个过程完成后就实现了转置.
在zip版本中,我们使用*arr语法将一维数组传递给zip做为参数,接着,zip返回一个元组做为结果.然后我们对每一个元组使用list方法,产生了列表的列表(即矩阵).因为我们没有直接将zip的结果表示为list,
所以我们可以我们可以使用itertools.izip来稍微的提高效率(因为izip并没有将数据在内存中组织为列表).
import itertools
print map(list,
itertools.izip(*arr))
但是,在特定的情况下,上面的方法对效率的微弱提升不能弥补对复杂度的增加.
关于*args和**kwds语法:
*args(实际上,*号后面跟着变量名)语法在Python中表示传递任意的位置变量,当你使用这个语法的时候(比如,你在定义函数时使用),Python将这个变量和一个元组绑定,并保留所有的位置信息,
而不是具体的变量.当你使用这个方法传递参数时,变量可以是任意的可迭代对象(其实可以是任何表达式,只要返回值是迭代器).
**kwds语法在Python中用于接收命名参数.当你用这个方式传递参数时,Python将变量和一个dict绑定,保留所有命名参数,而不是具体的变量值.当你传递参数时,变量必须是dict类型(或者是返回值为dict类型的表达式).
如果你要转置很大的数组,使用Numeric Python或其它第三方包,它们定义了很多方法,足够让你头晕的.
相关说明:
zip(...)
zip(seq1 [,
seq2 [...]]) - [(seq1[0], seq2[0] ...),
(...)]
Return a
list of tuples, where each tuple contains the i-th element
from each of
the argument sequences. The returned list is truncated
in length to
the length of the shortest argument sequence.
python数据转置函数的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于python数据转换函数、python数据转置函数的信息别忘了在本站进行查找喔 。

    推荐阅读