如何在数据帧的一列中使用字典访问该列的值并取另一列的平均值?

2024-04-19 15:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框架,其中一列包含单词和计数字典,另一列包含标签

|dict                     |label   |
|-------------------------|--------|
|{'word1':1, 'word2':2}   |1       |
|{'word2':4, 'word3':1}   |0       |
|{'word1':3, 'word4':2}   |0       |
|-------------------------|--------|

我需要输出所有单词、它们的计数和它们的平均标签(按计数加权):

|word   |count  |average|  
|-------|-------|-------|
|word1  |4      |0.25   |
|word2  |6      |0.33   |
|word3  |1      |0.0    |
|word4  |2      |0.0    |
|-------|-------|-------|

为了澄清平均值:对于word1,有一个实例的标签为1,第3行有三个实例的标签为0,因此平均值为1/4=0.25

我很难访问循环中的两个不同列。这本字典也让我很反感,我有点像python的书呆子,所以非常感谢您的帮助


1条回答
网友
1楼 · 发布于 2024-04-19 15:32:38

给你:

##!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd

# sample data
df = pd.DataFrame([
    {'dict': {'word1': 1, 'word2': 2}, 'label': 1},
    {'dict': {'word2': 4, 'word3': 1}, 'label': 0},
    {'dict': {'word1': 3, 'word4': 2}, 'label': 0}])


new_rows = []
count = {}
# lets iter over the rows and keep count of label and value
for row in df.iterrows():
    new = {}
    current_dict = row[1]['dict']
    current_label = row[1]['label']
    for x, y in current_dict.items():

        new[x] = current_label*y

        if x in count.keys():
            count[x] += y
        else:
            count[x] = y
    new_rows.append(new)

# calculate average only when we have full count
new_df = pd.DataFrame(new_rows).sum(axis=0, skipna=True).divide(pd.Series(count))
# append count column to the right
new_df = pd.concat([new_df, pd.Series(count)], axis=1)
# rename the header
new_df = new_df.rename(columns = pd.Series(['average', 'count']))

我首先重新构造数据,然后使用求和和和除法函数得到平均值

相关问题 更多 >