前言
本文为自己自学内容的记录,其中多有借鉴别人博客的地方,一并在参考文献中给出链接。其中内容有理解不到位的地方,请各位大佬在评论区给出修改意见,感恩🌹
一、问题阐述
想把第一张图片里的内容处理成第二张的那样。
二、代码演示
方法一:使用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() 方法被广泛用于 DataFrame、Series 或 GroupBy 对象上,用于对数据应用一个函数。函数可以是预定义的函数、匿名函数(即 lambda 函数),或者是任何可调用的对象。lambda 函数:这是一个小型匿名函数,定义为 lambda x: 。这里 x 是输入参数,而 是关于 x 的某些操作,其结果将被返回。
- 用于 Series:当 .apply() 应用于 pandas.Series 对象时,lambda 函数会逐一应用于序列中的每个元素。
import pandas as pd
s = pd.Series([1, 2, 3])
print(s.apply(lambda x:x**2))
- 用于 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))
- 用于 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'])
对上述代码进行解释:
- data.iterrows():iterrows()是DataFrame的一个方法,用于遍历DataFrame的每一行。它返回每一行的索引和行数据,行数据被作为一个Series对象返回。df.iterrows()被用于遍历df这个DataFrame的所有行。在每次循环中,index是行索引,row是那一行的数据(作为一个Series对象)。然后,代码检查row[‘company’]的值是否已经作为键存在于company_drug_dict字典中。
如果没有,它会创建一个新的键,其值是包含单个药品编号的集合(使用花括号{}创建一个集合)。
如果公司已经存在字典中,则它将新的药品编号添加到该公司的药品集合中。这样,company_drug_dict最终将每个公司与一个包含它们所有不同药品编号的集合关联起来 - company_drug_dict[company] = ', '.join(str(d) for d in sorted(company_drug_dict[company])),遍历排序后的药物编号列表,并将每个编号转换成字符串。如果一个公司相关联的药物编号集合是{1, 2, 3},经过这个处理后,字典中该公司的值将变为字符串"1, 2, 3"。
- result_df = pd.DataFrame(list(company_drug_dict.items()), columns=[‘company’, ‘drug’])将字典转换成DataFrame的形式。