按元素

时间:2015-04-27 23:43:30

标签: python pandas dataframe apply

我有一个需要重新表示的数据框。原始数据框将每行作为唯一搜索词,列是所有结果产品。所以每行的长度都不同。

我想将其转换为矩形数据框(在下面的代码中称为矩形),其中行仍然是唯一的搜索术语,但列标题是所有唯一的产品。现在每个元素都是1或0来表示该产品是否是该搜索词的结果。

这就是我所拥有的:

AshwiniInput = pd.read_csv('C:/Users/.../AshwiniInputData.csv')
AshwiniInput = AshwiniInput.set_index(keys='search_term_orig',drop = True,verify_integrity=True )    

#Get all unique products as a list
AllProducts = pd.unique(AshwiniInput.values.ravel())
AllProducts = [str(product) for product in (AllProducts)]

def MakeBoolDictOfSearchTermsAndProducts(Term, ProductsRelatedToTerm, AllProducts):
    """
    Use on each search term in AshwiniInput to get dict with 1 or 0 for each product
    """
    returnDict = {}
    for product in AllProducts:
        if product in ProductsRelatedToTerm:
            returnDict[product] = 1
        else:
            returnDict[product] = 0
    return Term, returnDict


rectangle = pd.DataFrame(np.zeros(shape = (len(AshwiniInput.index),len(AllProducts))),
                          index = AshwiniInput.index,
                          columns = AllProducts)

如何遍历rectangle中的每一行和每列以在其上运行我的函数MakeBoolDictOfSearchTermsAndProducts()并使用结果填写正确的元素?我应该使用申请吗?还是地图?或者也许是apply_map?

2 个答案:

答案 0 :(得分:0)

这会吗?

df = pd.read_csv('C:/Users/.../AshwiniInputData.csv')
rectangle = df.groupby(['product','search term']).\
    size().unstack('search term').astype(bool)

答案 1 :(得分:0)

通常,如果要迭代行并将每行视为向量,Pandas Dataframe很好。我建议你使用二维numpy数组。拥有数组后,您可以非常轻松地遍历每一行和每列。以下是示例代码:

`for  index, value in ndenumerate( self.cells ):
    do_something( value )
    self.cells[index] = new_value`