从pandas数据框创建计数器而不显示

时间:2017-12-14 17:18:12

标签: python pandas dataframe vectorization

我有一个像这样的pandas数据框:

{
   'entry': string,
   'category': string,
   'cat_1_score': float,
   'cat_2_score': float,
   'cat_3_score': float
}

此数据框的一部分:

**entry**             **category**
Entry161              cat_1
Entry37               cat_2; cat_1
Entry209              cat_1
Entry161              cat_1
Entry161              cat_1
Entry46               cat_1
Entry47               cat_3; cat_1
Entry37               cat_2; cat_1
Entry75               cat_1
Entry161              cat_1

可重复性:

df = pd.DataFrame([['Entry161', 'cat_1'], ['Entry137', 'cat_2; cat_1'], ['Entry209', 'cat_1'], ['Entry161', 'cat_1'], ['Entry161', 'cat_1'], ['Entry46', 'cat_1'], ['Entry47', 'cat_3; cat_1'], ['Entry37', 'cat_2; cat_1'], ['Entry75', 'cat_1'], ['Entry161', 'cat_1']], columns=['entry', 'category'])

我想创建一个Python Counter对象,它将是{'entry': {'category': count}}形式的嵌套字典。 entry的值不是唯一的,category的值可以是cat_1, cat_2, cat_3中的一个或多个。例如,在第一行中,由于只有cat_1cat_1_score的值将大于零,cat_2_scorecat_3_score的值将为零

在上面的示例中,Python Counter应该如下所示:

{'Entry161': {'cat_1': 4}, 'Entry37': {'cat_1':2, 'cat_2': 2}...}

category仅采用单个值的情况下,这样做的简单但尽管效率低的方法是迭代DataFrame的行,如下所示:

my_counter = defaultdict(Counter)
for i, row in df.iterrows():
    my_counter[row.entry][row.category] += 1

根据categorycat_1cat_2cat_3之一)的值,相应的_score非零。因此,必须有更快的方法来生成这些计数器而不迭代数据帧的行,而是使用矢量化。

不幸的是,如果可以选择在category列中包含多个条目,以分号分隔,这会变得更复杂,例如,一行可以有cat_1; cat_3作为此列的条目,并且柜台需要考虑这两种情况。在这种情况下,我的解决方法是:

for i, row in df.iterrows():
    for cat in ['cat_1', 'cat_2', 'cat_3']:
        if cat in row.category:
            my_counter[row.entry][cat] += 1

有没有办法用更多的熊猫首选方式替换这两个代码片段?

0 个答案:

没有答案