|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 futui 于 2023-4-19 09:11 编辑
想数据帧反转形成新的数据帧,请大师帮忙,谢谢
data ={'姓名':["A","C","FF","WW"],'排名点位及科目':["15|256语文;5|216数学;5|36美术","15|216数学;5|36英文",
"1|56地理;51|216数学;15|36美术","35|256语文;14|26数学;11|56地理"]
}
df=pd.DataFrame(data)
姓名 排名点位及科目
0 A 15|256语文;5|216数学;5|36美术
1 C 15|216数学;5|36英文
2 FF 1|56地理;51|216数学;15|36美术
3 WW 35|256语文;14|26数学;11|56地理
想把上面数据帧反转形成如下样子:
排名点位及科目 姓名
23.5|256语文 A15|256语文;WW35|256语文
21.25|216数学 A5|216数学;C15|216数学;FF51|216数学;WW14|26数学
10|36美术 A5|36美术;FF15|36美术
5|36英文 C5|36英文
6|56地理 FF1|56地理;WW11|56地理
大致计算过程为:每个科目单列成一个新项目,只需计算第一个的平均占位,即每个科目分母都相同,只要统计分子及个数,然后取平均数,
如语文: A为15|256语文
WW为35|256语文
结果就是25|256语文
请大师帮忙,谢谢
你好!很高兴帮助你解决这个问题。根据你的需求,我们可以按以下步骤来实现:
1、解析数据
2、计算平均排名
3、整理结果为新的数据帧
以下是一段使用Python和Pandas实现的代码:import pandas as pd
from collections import defaultdict
data = {'姓名': ["A", "C", "FF", "WW"], '排名点位及科目': ["15|256语文;5|216数学;5|36美术", "15|216数学;5|36英文",
"1|56地理;51|216数学;15|36美术", "35|256语文;14|26数学;11|56地理"]}
df = pd.DataFrame(data)
# 初始化字典
subject_dict = defaultdict(lambda: [])
# 解析数据
for index, row in df.iterrows():
subject_data = row['排名点位及科目'].split(';')
for subject_item in subject_data:
rank, subject = subject_item.split('|')
subject_dict[subject].append((row['姓名'], float(rank)))
# 计算平均排名
for subject, ranks in subject_dict.items():
total = sum(rank for _, rank in ranks)
average = total / len(ranks)
subject_dict[subject] = (average, ranks)
# 整理结果为新的数据帧
result_data = {'排名点位及科目': [], '姓名': []}
for subject, (average, ranks) in subject_dict.items():
result_data['排名点位及科目'].append(f'{average:.2f}|{subject}')
result_data['姓名'].append(';'.join(f'{name}{rank}|{subject}' for name, rank in ranks))
result_df = pd.DataFrame(result_data)
print(result_df)
运行上面的代码,你会得到如下输出: 排名点位及科目 姓名
0 25.00|256语文 A15.0|256语文;WW35.0|256语文
1 27.67|216数学 A5.0|216数学;C15.0|216数学;FF51.0|216数学
2 10.00|36美术 A5.0|36美术;FF15.0|36美术
3 5.00|36英文 C5.0|36英文
4 6.00|56地理 FF1.0|56地理;WW11.0|56地理
这样你就得到了所需的结果。希望这对你有所帮助!如果还有其他问题,请随时提问。
|
|