我有一个像这样的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_1
,cat_1_score
的值将大于零,cat_2_score
和cat_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
根据category
(cat_1
,cat_2
,cat_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
有没有办法用更多的熊猫首选方式替换这两个代码片段?