python Pandas/numpy的R的match()等价于什么?

2024-09-30 10:43:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个R用户,我无法计算出pandas等价于match()。我需要使用这个函数来迭代一堆文件,获取一个关键的信息片段,并将其合并回“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(),因为它们都没有必要的索引功能。我还尝试基于this SO post创建match()函数,但无法确定如何使它与DataFrame对象一起工作。抱歉,如果我错过了一些明显的东西。在

下面是一些python代码,总结了我在pandas中执行类似match()的无效尝试:

^{pr2}$

所需输出为:

    url  action  class
0   foo.com  0   0
1   foo.com  1   0
2   bar.com  0   1

但是,我需要能够一次又一次地调用它,这样我就可以遍历每个文件。在


Tags: 文件csv函数用户comurlpandasread
3条回答

注意pandas.match的存在,它正是R的match所做的。在

编辑

如果所有右数据帧中的url都是唯一的,那么可以将右数据帧作为由url索引的一系列class,然后通过索引得到左边每个url的类。在

from pandas import *
left = DataFrame({'url': ['foo.com', 'bar.com', 'foo.com', 'tmp', 'foo.com'], 'action': [0, 1, 0, 2, 4]})
left["klass"] = NaN
right1 = DataFrame({'url': ['foo.com', 'tmp'], 'klass': [10, 20]})
right2 = DataFrame({'url': ['bar.com'], 'klass': [30]})

left["klass"] = left.klass.combine_first(right1.set_index('url').klass[left.url].reset_index(drop=True))
left["klass"] = left.klass.combine_first(right2.set_index('url').klass[left.url].reset_index(drop=True))

print left

这是你想要的吗?在

^{2}$

输出:

   action      url  class
0       0  foo.com      0
1       1  foo.com      0
2       0  bar.com      1

如果左边的class列不是全部为NaN,则可以将其与结果合并。在

以下是我最终使用的完整代码:

#read in df containing actions in chunks:
tp = read_csv('/data/logactions.csv', 
  quoting=csv.QUOTE_NONNUMERIC,
  iterator=True, chunksize=1000, 
  encoding='utf-8', skipinitialspace=True,
  error_bad_lines=False)
df = concat([chunk for chunk in tp], ignore_index=True)

# set classes to NaN
df["klass"] = NaN
df = df[notnull(df['url'])]
df = df.reset_index(drop=True)

# iterate over text files, match, grab klass
startdate = date(2013, 1, 1)
enddate = date(2013, 1, 26) 
d = startdate

while d <= enddate:
    dstring = d.isoformat()
    print dstring

    # Read in each file w/ classifications in chunks
    tp = read_csv('/data/textContentClassified/content{dstring}classfied.tsv'.format(**locals()), 
        sep = ',', quoting=csv.QUOTE_NONNUMERIC,
        iterator=True, chunksize=1000, 
        encoding='utf-8', skipinitialspace=True,
        error_bad_lines=False)
    thisdatedf = concat([chunk for chunk in tp], ignore_index=True)
    thisdatedf=thisdatedf.drop_duplicates(['url'])
    thisdatedf=thisdatedf.reset_index(drop=True)

    thisdatedf = thisdatedf[notnull(thisdatedf['url'])]
    df["klass"] = df.klass.combine_first(thisdatedf.set_index('url').klass[df.url].reset_index(drop=True))

    # Now iterate
    d = d + timedelta(days=1)

相关问题 更多 >

    热门问题