我需要在Pandas中添加3列,计算另一列中3个值的计数

1 投票
2 回答
111 浏览
提问于 2025-04-14 17:29

我有一个数据表,里面有两列,每一行都有一个独特的ID,但根据顾客调查评分,同一个ID可能会有多个记录。

import pandas as pd

data = [['store1', 'High'], ['store1', 'Medium'], ['store2', 'Low'], ['store2', 'Low']]

df = pd.DataFrame(data, columns=['Shop', 'Review'])

我需要做的是创建三个新列,分别是高、中、低,并把每个店铺收到的高、中、低评分的总数放进去,这样就能在数据表中去掉每个店铺的多条记录。

2 个回答

1

你可以创建一个字典来存储评论,然后循环处理数据,把相应的值设置进去:

   data = [['store1', 'High'], ['store1', 'Medium'], ['store2', 'Low'], ['store2', 'Low']]
   reviews_dict = defaultdict(lambda: {'Low': 0, 'Medium': 0, 'High': 0})
   for entry in data:
       reviews_dict[entry[0]][entry[1]] += 1

之后只需要获取字典中的键和值,然后把它们添加到数据表中。

    df = pd.DataFrame(list(parsed_data.values()), index=parsed_data.keys(),
                  columns=['Low', 'Medium', 'High']).reset_index()

    df.rename(columns={'index': 'Shop'}, inplace=True)

结果:

    print(df)

    ===================================
       Shop  Low  Medium  High
  0  store1    0       1     1
  1  store2    2       0     0
3

你可以使用 pd.crosstab 来实现这个功能。为了让列的顺序变成 'High', 'Medium', 'Low',最好先把 df['Review'] 里的数据设置为分类数据(可以用 pd.Categorical)。

df['Review'] = pd.Categorical(df['Review'], categories=['High', 'Medium', 'Low'])

out = pd.crosstab(df['Shop'], df['Review'])
out

Review  High  Medium  Low
Shop                     
store1     1       1    0
store2     0       0    2

如果你不喜欢坐标轴的名称(比如“Shop”和“Review”),可以使用 df.rename_axis 来删除它们:

out = pd.crosstab(df['Shop'], df['Review']).rename_axis(index=None, columns=None)
out

        High  Medium  Low
store1     1       1    0
store2     0       0    2

撰写回答