|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
想数据帧反转形成新的数据帧,请大师再帮忙,谢谢
data ={'姓名':["A","C","FF","WW"],'科目及排名点位':["语文15|256;数学5|216;美术5|36","数学15|216;英文5|36",
"地理1|56;数学51|216;美术15|36","语文35|256;数学14|216;地理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|216;地理11|56
想把上面数据帧反转形成如下样子:
排名点位及科目 姓名
语文23.5|256 A语文15|256;WW语文35|256
数学21.25|216 A数学5|216;C数学15|216;FF数学51|216;WW数学14|26
美术10|36 A美术5|36;FF美术15|36
英文5|36 C英文5|36
地理6|56 FF地理1|56;WW地理11|56
大致计算过程为:每个科目单列成一个新项目,只需计算第一个的平均占位,即每个科目分母都相同,只要统计分子及个数,然后取平均数,
如语文: A为语文15|256
WW为语文35|256
结果就是语文25|256
请大师再帮忙,谢谢
你好!根据你的需求,我为你提供一个解决方案,通过使用 Pandas 库进行操作。请注意,这个方案可能不是最优的,但它能解决你的问题。
首先,我们需要将原始数据分解为适合操作的格式。然后,我们可以对数据进行分组和汇总,以得到期望的结果。
import pandas as pd
data = {'姓名': ["A", "C", "FF", "WW"],
'科目及排名点位': ["语文15|256;数学5|216;美术5|36", "数学15|216;英文5|36",
"地理1|56;数学51|216;美术15|36", "语文35|256;数学14|216;地理11|56"]
}
df = pd.DataFrame(data)
# 分解数据
rows = []
for index, row in df.iterrows():
subjects = row['科目及排名点位'].split(';')
for subject in subjects:
subject_rank, subject_value = subject.split('|')
rows.append([row['姓名'], subject_rank, int(subject_value)])
# 创建新的数据帧
new_df = pd.DataFrame(rows, columns=['姓名', '科目及排名点位', '排名点位值'])
# 计算每个科目的平均排名点位
result = new_df.groupby('科目及排名点位').agg({'排名点位值': 'mean'}).reset_index()
# 将原始数据合并到新的数据帧
merged_df = pd.merge(new_df, result, on='科目及排名点位', suffixes=('', '_平均'))
# 拼接姓名和科目及排名点位
merged_df['姓名_科目及排名点位'] = merged_df['姓名'] + merged_df['科目及排名点位']
# 创建最终结果数据帧
final_result = merged_df.groupby('科目及排名点位_平均')['姓名_科目及排名点位'].apply(';'.join).reset_index()
# 更改列名
final_result.columns = ['排名点位及科目', '姓名']
# 设置索引
final_result.set_index('排名点位及科目', inplace=True)
print(final_result)
|
|