我是一个 R 用户,我无法弄清楚 match() 的 pandas 等价物。我需要使用此函数遍历一堆文件,获取关键信息,并将其合并回“url”上的当前数据结构。在 R 我会做这样的事情:
logActions <- read.csv("data/logactions.csv")
logActions$class <- NA
files = dir("data/textContentClassified/")
for( i in 1:length(files)){
tmp <- read.csv(files[i])
logActions$class[match(logActions$url, tmp$url)] <-
tmp$class[match(tmp$url, logActions$url)]
}
我认为我不能使用 merge() 或 join(),因为每次都会覆盖 logActions$class。我也不能使用 update() 或 combine_first(),因为它们都没有必要的索引功能。我还尝试基于此 SO post制作 match() 函数,但无法弄清楚如何使其与 DataFrame 对象一起使用。抱歉,如果我遗漏了一些明显的东西。
下面是一些 Python 代码,总结了我在 pandas 中执行 match() 之类的无效尝试:
from pandas import *
left = DataFrame({'url': ['foo.com', 'foo.com', 'bar.com'], 'action': [0, 1, 0]})
left["class"] = NaN
right1 = DataFrame({'url': ['foo.com'], 'class': [0]})
right2 = DataFrame({'url': ['bar.com'], 'class': [ 1]})
# Doesn't work:
left.join(right1, on='url')
merge(left, right, on='url')
# Also doesn't work the way I need it to:
left = left.combine_first(right1)
left = left.combine_first(right2)
left
# Also does something funky and doesn't really work the way match() does:
left = left.set_index('url', drop=False)
right1 = right1.set_index('url', drop=False)
right2 = right2.set_index('url', drop=False)
left = left.combine_first(right1)
left = left.combine_first(right2)
left
所需的输出是:
url action class
0 foo.com 0 0
1 foo.com 1 0
2 bar.com 0 1
但是,我需要能够一遍又一遍地调用它,这样我就可以遍历每个文件。