鱼C论坛

 找回密码
 立即注册
查看: 1847|回复: 2

[已解决]问个类似的数据帧反转的问题,请再帮忙,谢谢

[复制链接]
发表于 2023-4-19 20:30:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


请大师再帮忙,谢谢
最佳答案
2023-4-19 20:33:46
你好!根据你的需求,我为你提供一个解决方案,通过使用 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-19 20:33:46 | 显示全部楼层    本楼为最佳答案   
你好!根据你的需求,我为你提供一个解决方案,通过使用 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 20:41:22 | 显示全部楼层
本帖最后由 futui 于 2023-4-19 21:57 编辑

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=['姓名', '科目及排名', '总人数'])
new_df['科目'] = new_df['科目及排名'].str.extract(r'(\D+)')
new_df['排名'] =new_df['科目及排名'].str.extract(r'(\d+)').astype(int)

#print(new_df)
# 计算每个科目的平均排名点位
result = new_df.groupby('科目')['排名'].mean()

# 将原始数据合并到新的数据帧
merged_df = pd.merge(new_df, result, on='科目', suffixes=('', '_平均'))

# 拼接姓名和科目及排名点位
merged_df['科目及排名_平均总人数'] = merged_df['科目'] + merged_df['排名_平均'].map(str) + '|' + merged_df['总人数'].map(str)
merged_df['姓名科目及排名总人数'] = merged_df['姓名'] + merged_df['科目及排名'] +  '|' + merged_df['总人数'].map(str)
print(merged_df)
# 创建最终结果数据帧
final_result = merged_df.groupby('科目及排名_平均总人数')['姓名科目及排名总人数'].apply(';'.join).reset_index()
print(final_result)
# 更改列名
final_result.columns = ['排名点位及科目', '姓名']

# 设置索引
final_result.set_index('排名点位及科目', inplace=True)

print(final_result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 15:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表