我需要在Pandas中添加3列,计算另一列中3个值的计数
我有一个数据表,里面有两列,每一行都有一个独特的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