Python 分组的方法


前言

本文为自己自学内容的记录,其中多有借鉴别人博客的地方,一并在参考文献中给出链接。其中内容有理解不到位的地方,请各位大佬在评论区给出修改意见,感恩🌹

一、问题阐述

想把第一张图片里的内容处理成第二张的那样。
在这里插入图片描述
在这里插入图片描述

二、代码演示

方法一:使用groupby()

import pandas as pd
import numpy as np

# 生成图片一中的表格
company = ['A','B','C']
drug = ['X','Y','Z']
data = pd.DataFrame({'company':[company[x] for x in np.random.randint(0,len(company),10)],'drug':[drug[i] for i in np.random.randint(0,len(drug),10)]}) 

# 按 'company' 列分组
grouped = data.groupby('company')
# 对每个分组的 'drug' 列取唯一值,并排序
unique_sorted = grouped['drug'].apply(lambda x: sorted(x.unique()))
# 将排序后的唯一值转换为字符串
unique_sorted_str = unique_sorted.apply(lambda x: ', '.join(map(str, x)))
# 将结果转换为 DataFrame
aggregated = unique_sorted_str.reset_index() # 输出图片二中的表格


对上述代码进行解释:
一. .apply() 在 Python 的 pandas 库中,.apply() 方法被广泛用于 DataFrameSeriesGroupBy 对象上,用于对数据应用一个函数。函数可以是预定义的函数、匿名函数(即 lambda 函数),或者是任何可调用的对象。lambda 函数:这是一个小型匿名函数,定义为 lambda x: 。这里 x 是输入参数,而 是关于 x 的某些操作,其结果将被返回。

  1. 用于 Series:当 .apply() 应用于 pandas.Series 对象时,lambda 函数会逐一应用于序列中的每个元素
import pandas as pd

s = pd.Series([1, 2, 3])
print(s.apply(lambda x:x**2))
  1. 用于 DataFrame:当应用于 DataFrame 上时,根据 apply() 调用的方式,lambda 函数可以逐行或逐列应用。但需要通过 axis 参数指定操作的轴。
import pandas as pd

s = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
print(s.apply(lambda x:max(x),axis=0))
  1. 用于 Groupby 对象:当用在 Groupby 对象上时,lambda 函数会应用于每个组的数据
import pandas as pd

data = pd.DataFrame({'Key': ['A', 'B', 'A', 'B'],'Value': [10, 20, 30, 40]})
grouped = data.groupby('Key')
average = grouped['Value'].apply(lambda x: x.mean())

二. join() join方法介绍
三. map(function,iterable)介绍:map方法介绍

方法二:使用字典的形式

import numpy as np
import pandas as pd

company = ['A','B','C']
drug = ['X','Y','Z']
data = pd.DataFrame({'company':[company[x] for x in np.random.randint(0,len(company),10)],'drug':[drug[i] for i in np.random.randint(0,len(drug),10)]})
company_drug_dict = {}

# 遍历DataFrame,组装字典
for index, row in data.iterrows():
    if row['company'] not in company_drug_dict:
        company_drug_dict[row['company']] = {row['drug']}
    else:
        company_drug_dict[row['company']].add(row['drug'])

# 将每个集合转换成排序后的字符串
for company in company_drug_dict:
    company_drug_dict[company] = ', '.join(str(d) for d in sorted(company_drug_dict[company]))

# 将字典转换为DataFrame
result_df = pd.DataFrame(list(company_drug_dict.items()), columns=['company', 'drug'])

对上述代码进行解释:

  1. data.iterrows():iterrows()是DataFrame的一个方法,用于遍历DataFrame的每一行。它返回每一行的索引和行数据,行数据被作为一个Series对象返回。df.iterrows()被用于遍历df这个DataFrame的所有行。在每次循环中,index是行索引row是那一行的数据(作为一个Series对象)。然后,代码检查row[‘company’]的值是否已经作为键存在于company_drug_dict字典中。
    如果没有,它会创建一个新的键,其值是包含单个药品编号的集合使用花括号{}创建一个集合)。
    如果公司已经存在字典中,则它将新的药品编号添加到该公司的药品集合中。这样,company_drug_dict最终将每个公司与一个包含它们所有不同药品编号的集合关联起来
  2. company_drug_dict[company] = ', '.join(str(d) for d in sorted(company_drug_dict[company])),遍历排序后的药物编号列表,并将每个编号转换成字符串。如果一个公司相关联的药物编号集合是{1, 2, 3},经过这个处理后,字典中该公司的值将变为字符串"1, 2, 3"。
  3. result_df = pd.DataFrame(list(company_drug_dict.items()), columns=[‘company’, ‘drug’])将字典转换成DataFrame的形式。
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值