futui 发表于 2023-4-19 20:30:03

问个类似的数据帧反转的问题,请再帮忙,谢谢

想数据帧反转形成新的数据帧,请大师再帮忙,谢谢

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
2FF    地理1|56;数学51|216;美术15|36
3WW语文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


请大师再帮忙,谢谢

isdkz 发表于 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(, 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)

futui 发表于 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(, 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)
页: [1]
查看完整版本: 问个类似的数据帧反转的问题,请再帮忙,谢谢