Как перезаписать данные в строке одного кадра данных срезом из другого - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть два кадра данных:

df_GB - список учеников и данные учеников для класса df_EV представляет собой набор ответов на опрос от подгруппы учащихся в классе

import pandas as pd
import numpy as np

# Create the two dataframes
In [82]: gradebook=[['Jim','T'],['Susan','F'],['Bob','F'],['Ellen','T']]
In [83]: df_GB=pd.DataFrame(gradebook,columns=['Name','Attend'])
In [84]: survey=[['Jim',1,3,4,'Awesome'],['Ellen',1,4,3,'Splendid'],['Fred',0,1,2,'Passable']]
In [85]: df_EV=pd.DataFrame(survey,columns=['Name','Q1','Q2','Q3','Comment'])

#Display the two dataframes
In [86]: df_GB
Out[86]: 
    Name   Attend
0    Jim        T
1  Susan        F
2    Bob        F
3  Ellen        T

In [87]: df_EV
Out[87]: 
    Name  Q1  Q2  Q3   Comment
0    Jim   1   3   4   Awesome
1  Ellen   1   4   3  Splendid
2   Fred   0   1   2  Passable

Я хочу добавить ответы на опрос для каждого учащегося, указанного в df_EV, в правильные строки в df_GB, чтобы получить следующее:

In [90]: df_result
Out[90]: 
    Name Attend   Q1   Q2   Q3   Comment
0    Jim      T  1.0  3.0  4.0   Awesome
1  Susan      F  NaN  NaN  NaN       NaN
2    Bob      F  NaN  NaN  NaN       NaN
3  Ellen      T  1.0  4.0  3.0  Splendid
4   Fred    NaN  0.0  1.0  2.0  Passable

снимок экрана того, как df_GB, df_EV и df_result выглядят как таблицы

Я попытался создать df_result из списка имен в df_GB, затем просмотреть циклы по именам в df_result, найти эти имена в df_EV и «вставить» в данные, используя loc, но это не работает, потому что я я пытаюсь вставить фрейм данных как серию в фрейм данных, и он выдает ошибку «ValueError: Несовместимый индексатор с сериями».

df_result['Name']=pd.DataFrame({'Name' : df_GB['Name']})
i=0
while i<df_result.shape[0]
   name=df_result.at[i,'Name']
   df_result.loc[i,'Q1':'Comment']=df_EV.loc[lambda df_EV: df_EV['Name']==name,['Q1','Q2','Q3','Comment']]
   i +=1

Я уже некоторое время бью себя по клавиатуре, пытаясь понять, как это сделать. Подсказки? Я новичок в python - скачал его вчера после нескольких лет использования Matlab для подобных задач - и это кажется слишком простой вещью, чтобы ее было так трудно понять.

Подобные вопросы, которые я прочитал, казалось, были решены путем добавления строк или столбцов к кадру данных, что, как я думаю, не сработает в этом случае, поскольку списки «Имя» в этих двух кадрах данных не совпадают, если только я не пропускаю очевидный трюк.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018
import pandas as pd

df_GB = pd.DataFrame([[ 'Jim','T'],['Susan','F'],['Bob','F'],'Ellen','T']],columns = [ 'Name', 'Attend'])
df_EV = pd.DataFrame([[ 'Jim',1,3,4,'Awesome'],['Ellen',1,4,3,'Splendid'],    ['Fred',0,1,2,'Passable']],columns = ['Name','Q1','Q2','Q3','Comment'])

df_result = pd.merge(df_EV,df_GB,on = 'Name',how = 'outer')

df_result
Out[33]: 
    Name   Q1   Q2   Q3   Comment Attend
0    Jim  1.0  3.0  4.0   Awesome      T
1  Ellen  1.0  4.0  3.0  Splendid      T
2   Fred  0.0  1.0  2.0  Passable    NaN
3  Susan  NaN  NaN  NaN       NaN      F
4    Bob  NaN  NaN  NaN       NaN      F



 df_GB.join(df_EV.set_index('Name'), on='Name',how ='outer')
Out[45]: 
    Name Attend   Q1   Q2   Q3   Comment
0    Jim      T  1.0  3.0  4.0   Awesome
1  Susan      F  NaN  NaN  NaN       NaN
2    Bob      F  NaN  NaN  NaN       NaN
3  Ellen      T  1.0  4.0  3.0  Splendid
3   Fred    NaN  0.0  1.0  2.0  Passable
0 голосов
/ 07 ноября 2018

@ Sacul решение полностью верно, используйте:

df_GB.merge(df_EV, how='outer')

Вот и все ...

merge метод делает много вещей для вас.

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html

...