从合并列的代码中获取类别类型

时间:2018-01-25 06:55:05

标签: python python-2.7 pandas numpy dataframe

我从数据框的两列创建了唯一的数字代码。现在,我想找到数字代码与原始值之间的相应映射。

例如,

meta

现在,我希望将映射作为词典

import scrapy
from scrapy.loader import ItemLoader
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = "myspider" 

    def start_requests(self):
        scrapy.Request(url="http://website_1.com", callback=self.parse_website_1)

    def parse_website_1(self, response):   
        item = ItemLoader(item=MyItem(), response=response)
        name = response.xpath('//div[@class="name"]/text()').extract_first()
        item.add_value("name", name)
        website_2_path = "http://website_1.com/" + name 
        yield scrapy.Request(url=website_2_path, callback=self.parse_website_2, meta={'item': item})

    def parse_website_2(self, response):
        item = response.meta['item']
        item.add_xpath("hair_color", '//div[@class="hair_color"]')
        yield item.load_item()

我怎样才能得到它?

2 个答案:

答案 0 :(得分:1)

您可以使用索引来扩展factorizezip中的第一个数组并转换为dict

cols = ['P1','P2']
a = (pd.factorize(df[cols].values.ravel()))

d = dict(zip(a[1][a[0]], a[0]+1))
print (d)
{'d': 4, 'b': 2, 'c': 3, 'a': 1}

df[cols] = (a[0]+1).reshape(-1, len(cols))
print (df)
   A  P1  P2
2  3   1   2
2  4   2   3
3  5   3   4
3  6   1   3

<强>详细

print (a)
(array([0, 1, 1, 2, 2, 3, 0, 2], dtype=int64), array(['a', 'b', 'c', 'd'], dtype=object))

print (a[1][a[0]])
['a' 'b' 'b' 'c' 'c' 'd' 'a' 'c']

print (a[0] + 1)
[1 2 2 3 3 4 1 3]

答案 1 :(得分:1)

建议:首先不要做所有疯狂的事情来转换DataFrame。创建映射然后应用它:

orig = pd.unique(df[cols].values.flatten())
code_map = dict(zip(orig, np.arange(orig.size)))
df[cols] = df[cols].applymap(code_map.__getitem__)

code_map  # returns {'a': 0, 'b': 1, 'c': 2, 'd': 3}

df # returns

A P1 P2
2  3  a  b
2  4  b  c
3  5  c  d
3  6  a  c