如何填充字符串数据框取决于数据框架或列表?

时间:2018-06-18 17:50:34

标签: r dataframe

我有一个包含名称的巨大数据框,我想用另一个数据框或列表的数字填充它。我该如何实现它?提前谢谢。

import cv2
import numpy as np

def corners(box):
    cx,cy,w,h,angle = box[0][0],box[0][1],box[1][0],box[1][1],box[2]
    CV_PI = 22./7.
    _angle = angle*CV_PI/180.;
    b = np.cos(_angle)*0.5;
    a = np.sin(_angle)*0.5;

    pt = []
    pt.append((int(cx - a*h - b*w),int(cy + b*h - a*w)));
    pt.append((int(cx + a*h - b*w),int(cy - b*h - a*w)));
    pt.append((int(2*cx - pt[0][0]),int(2*cy - pt[0][1])));
    pt.append((int(2*cx - pt[1][0]),int(2*cy - pt[1][1])));
    return pt

if __name__ == '__main__':

    image = cv2.imread('image.jpg',cv2.IMREAD_UNCHANGED)

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    n = 3
    sigma = 0.3 * (n/2 - 1) + 0.8
    gray = cv2.GaussianBlur(gray, ksize=(n,n), sigmaX=sigma)

    ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY)

    _,contours,_ = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

    contours.sort(key=lambda x: len(x), reverse=True)

    points = []
    for i in range(0,4):
        shape = cv2.approxPolyDP(contours[i], 0.05*cv2.arcLength(contours[i],True), True)
        if len(shape) == 4:
            points.append(shape)

    points = np.array(points,dtype=np.int32)
    points = np.reshape(points, (-1,2))
    box = cv2.minAreaRect(points)
    pt = corners(box)

    for i in range(0,4):
       image = cv2.line(image, (pt[i][0],pt[i][1]), (pt[(i+1)%4][0],pt[(i+1)%4][1]), (0,0,255))


    (h,w) = image.shape[:2]
    (center) = (w//2,h//2)
    angle = box[2]

    if angle < -45:
        angle = (angle+90)
    else:
        angle = -angle

    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    rotated = cv2.warpAffine(image, M, (w,h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_CONSTANT)

    cv2.imshow('image', image)
    cv2.imshow('rotated', rotated)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:1)

这可以通过lapplymatch

的组合来完成
output <- as.data.frame(lapply(df1, function(x) df2$Freq[match(x, df2$Var1)]))

如果你想写df1,你可以

df1[] <- lapply(df1, function(x) df2$Freq[match(x, df2$Var1)])

而不是对as.data.frame

的调用

答案 1 :(得分:1)

使用df2的另一种解决方案。这将从df1创建哈希查找表/词典,然后查找library(hashmap) lookup <- hashmap(as.character(df2$Var1), df2$Freq) df3 <- as.data.frame(lapply(df1, function(x) lookup[[x]])) 中的每个“键”并将其替换为相应的值:

> lookup
## (character) => (integer)
##         [J] => [2]      
##         [K] => [1]      
##         [A] => [4] 

> df3
  c..J....A....A.. c..A....K....K..
1                2                4
2                4                1
3                4                1

<强>结果:

{{1}}