разница между строками в многоуровневом фрейме данных - PullRequest
0 голосов
/ 09 октября 2018

Я хочу найти разницу между двумя строками в многоуровневых данных, повторяя значения в определенном классе и пробуя разные методы, читая учебные пособия, так как я все еще плохо знаком с питоном / пандами.

чтоЯ пытаюсь выяснить разницу между оценками учителя и каждого учащегося в определенном классе.

dataframe:

Class, Name ,Reference, stats
    X ,SHE ,student, 30
    X ,GHE ,student, 20
    X ,GMK ,student ,10
    X ,JKO ,teacher ,50
    Y ,HHH ,student ,20
    Y ,KLP ,teacher ,30

Вывод:

Class,teacher, student, difference
X, JKO, SHE,20
X, JKO,GHE, 30
X, JKO, GMK, 40
Y, KLP, HHH, 10

МожетКто-нибудь поможет мне, направляя меня в правильном направлении?в классе может быть более 1 учителя.

Спасибо

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Использование:

print (df)
  Class Name Reference  stats
0     X  SHE   student     30
1     X  GHE   student     20
2     X  GMK   student     10
3     X  JKO   teacher     50
4     X  ABC   teacher    100 <-added one new row for general data
5     Y  HHH   student     20
6     Y  KLP   teacher     30

df = (df.query("Reference == 'teacher'")
          .merge(df.query("Reference == 'student'"), on='Class', suffixes=('_t','_s'))
          .assign(difference=lambda x: x['stats_t'] - x['stats_s'])
          .drop(['Reference_s','Reference_t','stats_s','stats_t'], axis=1)
          .rename(columns={'Name_s':'student','Name_t':'teacher'})
          )
print (df)
  Class teacher student  difference
0     X     JKO     SHE          20
1     X     JKO     GHE          30
2     X     JKO     GMK          40
3     X     ABC     SHE          70
4     X     ABC     GHE          80
5     X     ABC     GMK          90
6     Y     KLP     HHH          10

Объяснение :

  1. Фильтр DataFrame по query с student иteacher строки
  2. Затем merge по столбцу Class для всех комбинаций в группах
  3. Затем assign новый столбец свычтите
  4. Удалите ненужные столбцы на drop
  5. Последний rename столбцы
0 голосов
/ 09 октября 2018

Просто разделите ваш набор данных на два фрейма данных, один для студентов, другой для учителей.Тогда объединяйтесь.

students = df[df.Reference == 'student'][['Class','Name','stats']]
teachers = df[df.Reference == 'teacher'][['Class','Name','stats']]

new_df = students.merge(teachers, on='Class', suffixes=('_student','_teacher'))
new_df['difference'] = new_df.stats_teacher - new_df.stats_student

print(new_df)
  Class Name_student  stats_student Name_teacher  stats_teacher  difference
0     X          SHE             30          JKO             50          20
1     X          GHE             20          JKO             50          30
2     X          GMK             10          JKO             50          40
3     Y          HHH             20          KLP             30          10
0 голосов
/ 09 октября 2018

Ниже приведен код с множеством циклов for.Поэтому должно быть оптимизированное решение, чем это.(Позже я попытаюсь обновить это решение в лучшую сторону)

import pandas as pd
df = pd.read_csv("student.csv")
ref = df[df['Reference'] == 'teacher'].index.values.astype(int)
df['TeacherName'] = 'NA'
df['Difference'] = 0

for i in range(len(ref)):
    if(i == 0):
        for j in range(ref[i]+1):

            df['TeacherName'][j] = df['Name'][ref[i]]
            df['Difference'][j] = df['stats'][ref[i]] - df['stats'][j]
    else:
         for j in range(ref[i-1]+1, ref[i]):

             df['TeacherName'][j] = df['Name'][ref[i]]
             df['Difference'][j] = df['stats'][ref[i]] - df['stats'][j]

df[~ df.index.isin(ref)]

Я получаю индекс строки для каждого вхождения df['Reference'] == 'teacher' в список с именем ref, который будет удален изdf после операторов цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...