我正在将我现有的R代码转换为Python,以此作为自学的一种方式,但我遇到了一些我似乎无法破解的问题。
下面是R代码的一个示例,它按预期工作
var <- 0.08
a <- data.frame(a = runif(10, 0, 1),
b = runif(10, 0, 1),
c = runif(10, 0, 1),
d = runif(10, 0, 1))
b <- data.frame(a = c(0,4,6,8,10,12,12,14,16,18),
b = c(2,6,8,10,12,14,14,16,18,20),
c = c(4,8,10,12,14,16,16,18,20,22),
d = c(6,10,12,14,16,18,18,20,22,24))
output <- data.table(total = seq(0, 10))
output[total%%2==0, prob:= apply(output[total%%2==0], 1, function(x) { sum(a[, 1:4] * (b[, 1:4]==x[1]))})]
output[total%%2==1, prob:= apply(output[total%%2==1], 1, function(x) { sum(a[, 1:4] * (b[, 1:4]==(x[1]-1))) * var/(1-var)})]
这是我在Python中尝试的,它在'prob'列中返回'nan'字段
import numpy as np
import pandas as pd
var = 0.08
a = pd.DataFrame(np.random.uniform(0, 1, size=(10, 4)), columns=['a', 'b', 'c', 'd'])
b = pd.DataFrame({'a': [0, 4, 6, 8, 10, 12, 12, 14, 16, 18],
'b': [2, 6, 8, 10, 12, 14, 14, 16, 18, 20],
'c': [4, 8, 10, 12, 14, 16, 16, 18, 20, 22],
'd': [6, 10, 12, 14, 16, 18, 18, 20, 22, 24]})
output = pd.DataFrame({'total': range(0, 11)})
output.loc[output['total'] % 2 == 0, 'prob'] = output[output['total'] % 2 == 0].apply(lambda x: np.sum(a.iloc[:, 0:4] * (b.iloc[:, 0:4] == x[0])), axis=1)
output.loc[output['total'] % 2 == 1, 'prob'] = output[output['total'] % 2 == 1].apply(lambda x: np.sum(a.iloc[:, 0:4] * (b.iloc[:, 0:4] == (x[0] - 1))) * var / (1 - var), axis=1)
任何帮助都将不胜感激!
谢谢
1条答案
按热度按时间bxgwgixi1#
不幸的是,这是你在把R代码移植到Python代码时需要学习的一些东西。在R中,你知道
data.frame
的值之和将是每个元素之和,而pandas
不是这样。例如,请看question。默认情况下,当你在
DataFrame
中调用sum
时,它会对各行求和,而不是对所有值求和。你最终得到的是在你使用apply
的DataFrame
的每个元素中有一个Series
,而实际上你期望的是一个单一的值。如果你打印每个迭代,你可以测试这个。你会看到一堆
Series
。你的问题的解决方案是再次对Series
的值求和,或者把DataFrame
转换成numpy.array
。| | 总计|探针|
| - ------|- ------|- ------|
| 无|无|0.503596美元|
| 1个|1个|0.0437909|
| 第二章|第二章|零点二零七四八|
| 三个|三个|0.0180417分|
| 四个|四个|0.666049|
| 五个|五个|0.0579173美元|
| 六个|六个|一点三五九七一|
| 七|七|0.118235|
| 八个|八个|一点三三一五六|
| 九|九|0.115787美元|
| 十个|十个|二点五四九六|
我想这就是你想要的。你一定要在进一步的问题中提供所需的输出,因为这样做会更容易提供帮助。