Python:如何在R中进行基本数据操作?

jjo*_*ras 15 python r

我和R一起工作了好几年.R在数据操作方面非常强大.我正在学习python,我想知道如何使用python操作数据.基本上我的数据集被组织为数据框(例如excel表).我想知道(通过示例)如何使用python完成这种基本数据操作任务?

1. Read csv file like the following

var1, var2, var3
1, 2, 3
4, 5, 6 
7, 8, 9

2. Subset data where var2 in ('5', '8') 
3. Make a new variable --> var4 = var3 * 3
4. Transpose this data
5. Write to csv file
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助和示例!

Dav*_*ark 22

我不同意Cpfohl的评论 - 也许是因为我自己经历过这个相同的转变,并且一个天真的用户如何能够更准确地表达问题并不明显.它实际上是一个积极的开发问题,目前有许多项目都提出了非重叠功能(例如在金融时间序列世界,大脑成像领域等).

简短的回答是python用于处理表和csv文件的各种库对于初学者而言不如R中的那些好,这是多年不同级别用户的最终结果.

首先,看看numpy中的重新排列.这可能是常用库中最接近的数据结构,类似于R中的data.frame.特别是,你可能会喜欢numpy.recfromcsv函数,尽管它不像read.csv那样健壮.在R中(例如,它会遇到非标准的行尾).

重新排列重新排列很容易(尽管创建一个看起来很笨重):

import numpy as np
mydata = np.array([(1.0, 2), (3.0, 4)], dtype=[('x', float), ('y', int)])
mydata = mydata.view(np.recarray)
mydata[mydata.x > 2]
Run Code Online (Sandbox Code Playgroud)

修改numpy数组的性质通常不像R中那么容易,但是有一个很好的函数库numpy.lib.recfunctions(必须单独导入 - 它不会带来简单的import numpy).特别是,请查看rec_append_fields和rec_join以添加列.

Numpy有一个函数numpy.savetxt可以接受一个简单的分隔符参数来制作一个csv文件,但它不会遗憾地打印列名(至少,我没有看到它的确如此).所以,虽然我不鼓励添加不必要的库(因为它提供了更少的可移植代码),你可能只是使用matplotlib.mlab.rec2csv(你也会在该邻域中找到一些其他类似的函数 - numpy社区试图移植一般有用的数字/数据操作代码要知道,也许你会这样做?).

你会注意到我没有回答(4),因为这没有意义.表不能在python或R中转置.数组或矩阵可以.因此,将数据转换为具有统一dtype的数组,然后使用myarray.T.

你可能会看到的其他工具是pytables(以及相关的包carray),larry,datarray,pandas和tabular.特别是,datarray正在寻求为标记数据阵列创建一个系统,该系统将作为其他项目的基础(我认为还有来自拉里和熊猫项目的开发人员).

希望有所帮助!DAV


nos*_*klo 14

import csv
from itertools import izip

with open('source.csv') as f:
    reader = csv.reader(f)
    # filter data
    data = (row for row in reader if row[1].strip() in ('5', '8'))
    # make a new variable
    data = (row + [int(row[2]) * 3] for row in data)
    # transpose data
    data = izip(*data)
    # write data to a new csv file
    with open('destination.csv', 'w') as fw:
        csv.writer(fw).writerows(data)
Run Code Online (Sandbox Code Playgroud)


Wes*_*ney 11

简单回答:使用熊猫

1

In [2]: df = read_csv('foo.csv', index_col=None)

In [3]: df
Out[3]: 
   var1  var2  var3
0  1     2     3   
1  4     5     6   
2  7     8     9   
Run Code Online (Sandbox Code Playgroud)

2

In [4]: df[df['var2'].isin([5, 8])]
Out[4]: 
   var1  var2  var3
1  4     5     6   
2  7     8     9   
Run Code Online (Sandbox Code Playgroud)

3

In [5]: df['var4'] = df['var3'] * 2

In [6]: df
Out[6]: 
   var1  var2  var3  var4
0  1     2     3     6   
1  4     5     6     12  
2  7     8     9     18  
Run Code Online (Sandbox Code Playgroud)

4

In [7]: df.T
Out[7]: 
      0  1   2 
var1  1  4   7 
var2  2  5   8 
var3  3  6   9 
var4  6  12  18
Run Code Online (Sandbox Code Playgroud)

6

In [8]: df.to_csv('foo2.csv')

In [9]: !cat foo2.csv
index,var1,var2,var3,var4
0,1,2,3,6
1,4,5,6,12
2,7,8,9,18
Run Code Online (Sandbox Code Playgroud)