- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 csv 文件 (original.csv
),其中包含唯一 ID 列 (uid
) 和我想要评估的列,然后创建一个新文件 (result.csv
)使用未修改的 uid
并根据评估创建新列。
我的原始文件如下所示:
uid,var01,var02,var03,var04,var05
1,2,3,2,3,1
2,2,2,2,2,1
3,,2,2,1,1
4,2,2,2,1,1
5,1,2,2,1,2
6,3,,2,3,2
7,3,,1,1,1
8,2,3,1,,3
9,3,1,,3,
10,,3,2,3,3
我想做一个与此逻辑相同的评估(用 SQL 编写): case when var01 = 1 then 1 else 0 end as var01_new, case when var02 = 1 then 1 else 0 end as var02_new ,...
结果将如下所示:
uid,var01_new,var02_new,var03_new,var04_new,var05_new
1,0,0,0,0,1
2,0,0,0,0,1
3,0,0,0,1,1
4,0,0,0,1,1
5,1,0,0,1,0
6,0,0,0,0,0
7,0,0,1,1,1
8,0,0,1,0,0
9,0,1,0,0,0
10,0,0,0,0,0
考虑到实际文件的大小(约 20M 行,50+ 列),我希望将解决方案保留在基本 Python
中,而不是像 Pandas
这样的内存有限的包> 和Numpy
。我试过modifying this S/O question但我无法让它适用于我的用例。
我尝试了这段代码,但没有成功。
>>> import csv
>>>
>>> sourcepath = "/Users/me/python_case_statement.csv"
>>> destpath = "/Users/me/python_case_statement_flat.csv"
>>>
>>> with open(sourcepath, "rb") as source, open(destpath, "wb") as dest:
... reader = csv.reader(source, delimiter = ',', quotechar='"')
... writer = csv.writer(dest, delimiter = ',', quotechar='"')
... headers = reader.next()
... writer.writerow(headers)
... for rownum, row in enumerate(reader):
... 'uid' = 'uid'
... if 'var01' == 1:
... 'var01_new' == 1
... else:
... 'var01_new' == 0
... row.append(result)
... writer.writerow(row)
...
File "<stdin>", line 7
SyntaxError: can't assign to literal
>>>
最佳答案
所以Python不像SQL那样是一种纯粹的声明性语言,它是过程性的,所以你必须描述控制流,尽管它有很多声明性的结构。所以,
>>> s = """uid,var01,var02,var03,var04,var05
... 1,2,3,2,3,1
... 2,2,2,2,2,1
... 3,,2,2,1,1
... 4,2,2,2,1,1
... 5,1,2,2,1,2
... 6,3,,2,3,2
... 7,3,,1,1,1
... 8,2,3,1,,3
... 9,3,1,,3,
... 10,,3,2,3,3"""
>>> reader = csv.reader(io.StringIO(s))
>>> result = io.StringIO()
>>> writer = csv.writer(result)
上面只是让我们假装我们正在使用流(io.StringIO
)来处理文件。但是您可以像使用 with 语句一样完成此操作。现在,问题的症结是:
>>> header = next(reader)
>>> writer.writerow(["{}_new".format(v) for v in header])
59
>>> for row in reader:
... new_row = [row[0]] # uid the same
... new_row.extend(1 if c == '1' else 0 for c in row[1:])
... writer.writerow(new_row)
...
13
13
13
13
13
13
13
13
13
14
>>> print(result.getvalue())
uid_new,var01_new,var02_new,var03_new,var04_new,var05_new
1,0,0,0,0,1
2,0,0,0,0,1
3,0,0,0,1,1
4,0,0,0,1,1
5,1,0,0,1,0
6,0,0,0,0,0
7,0,0,1,1,1
8,0,0,1,0,0
9,0,1,0,0,0
10,0,0,0,0,0
>>>
我使用了理解结构和条件表达式,它们允许使用更好、更具声明性的方式来转换数据。但是,如果没有它们,您可以使用 if-else
语句并构建行来执行相同的操作:
>>> result = io.StringIO()
>>> reader = csv.reader(io.StringIO(s))
>>> writer = csv.writer(result)
>>> header = next(reader)
>>> new_header = []
>>> for s in header:
... new_header.append("{}_new".format(s))
...
>>> writer.writerow(new_header)
59
>>> for row in reader:
... new_row = []
... for c in row:
... if c == '1':
... new_row.append(1)
... else:
... new_row.append(0)
... writer.writerow(new_row)
...
13
13
13
13
13
13
13
13
13
13
>>> print(result.getvalue())
uid_new,var01_new,var02_new,var03_new,var04_new,var05_new
1,0,0,0,0,1
0,0,0,0,0,1
0,0,0,0,1,1
0,0,0,0,1,1
0,1,0,0,1,0
0,0,0,0,0,0
0,0,0,1,1,1
0,0,0,1,0,0
0,0,1,0,0,0
0,0,0,0,0,0
关于python - 来自 CSV 文件的 Python 中的 Case/IfElse 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864955/
if () {}else if (){} else if (){} else if (){} else{} 我们是否需要至少有一个else {}? 最佳答案 不,不需要 else block 。 以下
如果为TRUE,我想从函数返回一个data.frame,否则使用return(ifelse(condition, mydf, NA)) 返回NA 但是, ifelse 会从 data.frame 中删
我有一个如下所示的数据框: dat <- data.frame(T1 = c('s', 's', 'm', 'l', 'm', 'xl'), T2 = c('s',
我有两个矩阵: mat <- matrix(1:6, 2, 3) mat2 <- matrix(1:2, 2, 3) 和一个参数 a <- 1 使用 ifelse , 是否可以在 a 时返回矩阵是一定
这个问题在这里已经有了答案: How to prevent ifelse() from turning Date objects into numeric objects (7 个答案) 关闭 7
而 R 的 ifelse非常方便,它确实有一个特别的缺点:在通话中 ifelse(test, yes, no) yes的所有元素和 no被评估,即使是那些将被扔掉的。 如果您在复杂的数值练习中使用它,
我有一个数据框(示例数据): id dat$ex1 + dat$ex2, 5, dat$ex) 此处,ex1 是最大值,其次是 ex1 和 ex2。 对于 id 2,它应该是: dat$ex da
我从 ifelse() 得到了一个完全出乎意料的结果,如果能解释原因,我将不胜感激。请参阅底部的可重现数据。 split_ratio = 0.8 target_label = "DV" trainin
我希望将两个函数之一应用于向量元素。选择使用哪个函数是基于向量的值。 具体来说:假设所有日期都在 1919 年和 2018 年之间,假设您想将用两位数字编码的年份(如 '07' 表示 '2007' 和
我仍然觉得 R 中的 ifelse 结构有点困惑,我有以下数据框: df <- structure(list(snp = structure(1:11, .Label = c("AL0009", "A
运行后我得到了意想不到的结果: test = c(rep(FALSE, 2), rep(TRUE, 6)) ifelse(test, c(1:8)[test], 1) [1] 1 1 5 6 7
这很奇怪:R的ifelse()似乎做了一些(不需要的)强制转换: 可以说我有一个时间戳向量(可能是NA),并且NA值应与现有日期区别对待,例如,只需忽略即可: formatString = "%Y-%
想法是使用可管理的方法从一些表中定义规则: library(data.table) a % print() lb[a, on = .(rule, bool), nomatch = 0L][
我有两个向量: ab 1 if ab,1,0) 但我不确定如何合并a和b相等的情况。 最佳答案 如何添加另一个ifelse: ifelse(a>b, 1, ifelse(a==b, sample(1:
基本上在 SAS 中,我可以在没有 else 的情况下执行 if 语句。例如: if species='setosa' then species='regular'; 不需要别的。 如何在R中做到这一
如果运行此命令,则会获得有关财务报表的信息 library(RJSONIO) data<-fromJSON("http://www.registeruz.sk/cruz-public/api/ucto
我有两个如下变量: var a = "active" //[two possible value active/inactive] var b = "inactive" //[three possi
我仍在学习 R,并遇到了一些超出我理解的事情。我花了大约 2 个小时试图自己解决这个问题,但失败了:-( 。 我有一个 data.frame(例如,让我们考虑一下鸢尾花),我想使用 ifelse 对其
我从 ifelse 函数中得到了意想不到的结果: vector <- factor(c('x', 'x', 'y', 'z'), levels = c('x', 'y', 'z')) ifelse(c
我有一个非常大的数据框(大约 100 行,200 列)。我的数据子集如下所示: example = 100,则 3 个数字 我知道对特定列执行类似的操作: example$Value1 = 100)
我是一名优秀的程序员,十分优秀!