【发布时间】:2014-01-23 18:02:57
【问题描述】:
我转换了这个 R 代码:
# Raw data
data <- data.frame(
metalname=c('Al','Cd','Cr','Co','Cu','Au','Fe','Pb','Mo','Ni','Pt','Au','Ta','Ti','W','Zn'),
radius=c(0.1431,0.1490,0.1249,0.1253,0.1278,0.1442,0.1241,0.1750,0.1363,0.1246,0.1387,0.1445,0.1430,0.1445,0.1371,0.1332),
crystal=c('FCC','HCP','BCC','HCP','FCC','FCC','BCC','FCC','BCC','FCC','FCC','FCC','BCC','HCP','BCC','HCP'))
# Calc lattice parameters (nm)
data <- rbind(
transform(subset(data, crystal=='BCC'), N=2, latticea=4*radius/sqrt(3), latticec=0),
transform(subset(data, crystal=='FCC'), N=4, latticea=2*radius*sqrt(2), latticec=0),
transform(subset(data, crystal=='HCP'), N=6, latticea=2*radius, latticec=4*radius*sqrt(2/3))
)
到这个 Pandas 代码:
import pandas as pd
import numpy as np
import math
from pandas import DataFrame
# Raw data
data = DataFrame({
'metalname': ['Al','Cd','Cr','Co','Cu','Au','Fe','Pb','Mo','Ni','Pt','Au','Ta','Ti','W','Zn'],
'radius': [0.1431,0.1490,0.1249,0.1253,0.1278,0.1442,0.1241,0.1750,0.1363,0.1246,0.1387,0.1445,0.1430,0.1445,0.1371,0.1332],
'crystal': ['FCC','HCP','BCC','HCP','FCC','FCC','BCC','FCC','BCC','FCC','FCC','FCC','BCC','HCP','BCC','HCP']
})
# Calc lattice parameters (nm)
databcc = data[data.crystal=='BCC']
databcc['N'] = 2
databcc['latticea'] = 4*databcc.radius/math.sqrt(3)
datafcc = data[data.crystal=='FCC']
datafcc['N'] = 4
datafcc['latticea'] = 2*datafcc.radius/math.sqrt(2)
datahcp = data[data.crystal=='HCP']
datahcp['N'] = 6
datahcp['latticea'] = 2*datahcp.radius
datahcp['latticec'] = 4*datahcp.radius*math.sqrt(2/3)
data = databcc.append(datafcc).append(datahcp)
代码有效,但有没有办法让 Python 版本更简洁?理想情况下,我可以一步完成多列计算,而无需像 R 代码这样的临时变量。这可能吗?
【问题讨论】:
-
在python 2.7 math.sqrt(2/3) 为0,需要指定2.0/3.0才能使用浮点除法
-
我正在使用 Python 3,但我知道,您对 Python 2.x 的看法是绝对正确的
标签: r python-3.x pandas