首页 > 解决方案 > 如何用 pandas 构造向量化函数?

问题描述

我不确定如何构建我想在熊猫中矢量化的函数。

我有两个像这样的df:

contents = pd.DataFrame({
'Items': [1, 2, 3, 1, 1, 2],
})

cats = pd.DataFrame({
'Cat1': ['1|2|4'],
'Cat2': ['3|2|5'],
'Cat3': ['6|9|11'],
})

我的目标是为每行.insert创建一个新列,如果是元素或其他。这是要重复每。contents1contents['Items']cats['cat1']0cat

目标格式:

contents = pd.DataFrame({
'Items': [1, 2, 3, 1, 1, 2],
'contains_Cat1': [1, 1, 0, 1, 1, 1],
'contains_Cat2': [0, 1, 1, 0, 0, 1],
'contains_Cat3': [0, 0, 0, 0, 0, 0],
})

由于我的内容 df 很大(!),我想对其进行矢量化。我对每只猫的方法是做这样的事情

contents.insert(
    loc=len(contents.columns),
    column='contains_Cat1',
    value=has_content(contents, cats['Cat1'])

def has_content(contents: pd.DataFrame, cat: pd.Series) -> pd.Series:
    # Initialization of pd.Series here??
    if contents['Items'] in cat:
        return True
    else:
        return False

我的问题是:我如何构建我的has_content(...)?我特别不清楚的是我如何初始化该 pd.Series 以包含所有False值。我什至需要吗?之后,我知道如何检查某些东西是否包含在其他东西中。但是我真的可以像上面那样按列执行并立即返回而不变成单元格吗?

标签: pythonpandasvectorization

解决方案


尝试使用,然后使用和str.get_dummies重塑stackunstack

out = cats.stack().str.get_dummies().stack()\
          .unstack(level=1).reset_index(level=0,drop=True)\
           .reindex(contents.Items.astype(str))
Out[229]: 
       Cat1  Cat2  Cat3
Items                  
1         1     0     0
2         1     1     0
3         0     1     0
1         1     0     0
1         1     0     0
2         1     1     0

改进:

out=cats.stack().str.get_dummies().droplevel(0).T\
        .add_prefix('contains_').reindex(contents['Items'].astype(str)).reset_index()

Out[230]: 

    Items   contains_Cat1   contains_Cat2   contains_Cat3
0   1       1               0               0
1   2       1               1               0
2   3       0               1               0
3   1       1               0               0
4   1       1               0               0
5   2       1               1               0

推荐阅读