R'的等价物是什么;python熊猫/numpy的s match()?

R'的等价物是什么;python熊猫/numpy的s match()?,python,r,merge,pandas,match,Python,R,Merge,Pandas,Match,我是一个R用户,无法计算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

我是一个R用户,无法计算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)]
}
所需输出为:

    url  action  class
0   foo.com  0   0
1   foo.com  1   0
2   bar.com  0   1
但是,我需要能够一遍又一遍地调用它,这样我才能迭代每个文件。

Edit

如果所有右数据帧中的url都是唯一的,则可以将右数据帧作为一系列
url
索引,然后可以通过索引它来获取左侧每个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
这是你想要的吗

import pandas as pd
left = pd.DataFrame({'url': ['foo.com', 'foo.com', 'bar.com'], 'action': [0, 1, 0]})
left["class"] = NaN
right1 = pd.DataFrame({'url': ['foo.com'], 'class': [0]})
right2 = pd.DataFrame({'url': ['bar.com'], 'class': [ 1]})

pd.merge(left.drop("class", axis=1), pd.concat([right1, right2]), on="url")
输出:

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

如果左侧的类列不全是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)
#读入包含块中操作的df:
tp=read_csv('/data/logactions.csv',
quoting=csv.QUOTE非数字,
迭代器=True,chunksize=1000,
encoding='utf-8',skipinitialspace=True,
错误(错误行=错误)
df=concat([chunk for chunk in tp],ignore_index=True)
#将类设置为NaN
df[“klass”]=NaN
df=df[notnull(df['url'])]
df=df.reset_索引(drop=True)
#迭代文本文件,匹配,抓取klass
起始日期=日期(2013年1月1日)
enddate=日期(2013年1月26日)
d=起始日期

而d则注意到熊猫.match的存在,它与R
match的作用完全相同

谢谢,但我需要为每个文件调用一次match()等价项,这样这种方法就不起作用了:(在每个正确的数据帧中都是唯一的(但可以在dfs中重复)。理想情况下,这个问题的解决方案是不可知的。但我认为按url索引的类是正确的方法。嘿,韦斯,你能给我指一下pandas.match的文档吗?我在这里或这里没有看到它?谢谢!
In:pd.match([1,2,3],[1,2])Out:array([0,1,-1],dtype=int64)
在匹配第二个数组中的第一个值时,似乎给出了0,在匹配第二个值时,给出了1,依此类推,在不匹配时,给出了-1。使用此解决方案时要小心。pd.match([1,2,3,5,8,2],[1,2,4,5,9,2])生成数组([0,5,-1,3,-1,5])它只会返回一个匹配,而不是你希望的1和5。可能是最相关的。
#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)