Нарезка данных из двух столбцов и вывод новых значений в Pandas Advice - PullRequest
0 голосов
/ 15 мая 2018

Предположим, у нас есть следующий кадр данных:

import pandas as pd
df = pd.read_csv('subjects.csv')
Col A,              Interest, Col Start, Col Go, Col Learn,
Learn English Lit           
Go Mathematics      
Start Science       
Learn Science       
Go English          
Start Math          
Learn Math          
Go Biology          
Start English       

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

#Map Interests 
Mapper = ['English', 'Math', 'Maths', 'Mathematics', 'Biology', 'Science'] 
#Join Mapper to Interest Column
pat = '|'.join(r"\b{}\b".format(x) for x in Mapper)
df['interest'] = df['col A'].str.extract('('+ pat + ')', expand=False)


#Align Interest Names by creating a dict and replacing values
enter code here
d = {'English Lit' : 'English', 'Biology' : 'Science', 'Mathematics' : 'Maths'} 
df['Interests'] = df['Interests'].replace(d, inplace=False)

>>> Output:

Col A,              Interest, Col Start, Col Go, Col Learn,
    Learn English Lit   English         
    Go Mathematics      Maths
    Start Science       Science
    Learn Science       Science
    Go English          English
    Start Math          Maths
    Learn Math          Maths
    Go Biology          Science
    Start English       English 

Теперь мне нужно измерить вовлеченность полковника А с помощью ключевого слова и интереса.

Я сделал это следующим образом, но я уверен, что есть лучшие способы сделать это.

df['Col Start'][df['col A'].str.contains("Learn", na=False) & df['interest'].str.contains("Science")] = 'Learn'

Кроме того, что было бы лучшим способом добавить несколько значений в один столбец? например, если бы я имел:

Col A                         
Learn Science, Math, Biology.

Я бы хотел, чтобы ключевое слово + проценты отображалось в новый столбец со значениями, разделенными запятыми. Вот где мои текущие сценарии распадаются, он записывает поверх новых значений предыдущие, где я пытался охватить все уровни взаимодействия (если это имеет смысл ..)

Col A                         Col B
Learn Science, Math, Biology. Learn S, Learn, M, Learn B

Любая помощь будет благодарна. (пожалуйста, будьте осторожны, я начал кодировать в феврале!)

Редактировать для ясности:

df.loc[df['col A'].str.contains("Learn", na=False) & df['interest'].str.contains("Science"), 'Col Start'] = 'Learn S'
df.loc[df['col A'].str.contains("Learn", na=False) & df['interest'].str.contains("English"), 'Col Start'] = 'Learn E'
df.loc[df['col A'].str.contains("Learn", na=False) & df['interest'].str.contains("Math"), 'Col Start'] = 'Learn M'


Col A                Col Learn
Learn Science, Math  Learn S, Learn M
Learn Math, English  Learn M, Learn E
Learn Science        Learn S.

Возможно, в моем DF Col A & Interest может перекрываться и иметь повторяющиеся результаты. То, что я хочу, чтобы захватить их всех и не перезаписывать их, а добавлять любые новые вводы с запятой

1 Ответ

0 голосов
/ 15 мая 2018

Я думаю, что нужно findall, если нужно извлечь все значения по списку с пониманием списка и join для добавления строки Learn:

#better is use loc for set new column
df.loc[df['col A'].str.contains("Learn", na=False) & df['interest'].str.contains("Science"), 'Col Start'] = 'Learn'

df['new'] = df['col A'].str.findall('('+ pat + ')').apply(lambda x: ', '.join(['Learn ' + y for y in x]))
print (df)

                           col A     interest Interests Col Start  \
0              Learn English Lit      English   English       NaN   
1                 Go Mathematics  Mathematics     Maths       NaN   
2                  Start Science      Science   Science       NaN   
3                  Learn Science      Science   Science     Learn   
4                     Go English      English   English       NaN   
5                     Start Math         Math      Math       NaN   
6                     Learn Math         Math      Math       NaN   
7                     Go Biology      Biology   Science       NaN   
8  Learn Science, Math, Biology.      Science   Science     Learn   

                                        new  
0                             Learn English  
1                         Learn Mathematics  
2                             Learn Science  
3                             Learn Science  
4                             Learn English  
5                                Learn Math  
6                                Learn Math  
7                             Learn Biology  
8  Learn Science, Learn Math, Learn Biology  

EDIT:

print (df)
                 col A         Col Learn
0  Learn Science, Math  Learn S, Learn M
1  Learn Math, English  Learn M, Learn E
2        Learn Science           Learn S
3              Science               val

#create dictionary for new values by keys
d = {'Science':'S', 'English':'E', 'Math':'M'}
#check if Learn
mask = df['col A'].str.contains("Learn", na=False)
#extract all values by keys of dict, replace values by dicts by lookup and join with Learn
s = (df['col A'].str.findall('('+ '|'.join(d.keys()) + ')')
                .apply(lambda x: ', '.join(['Learn ' + d[y] for y in x])))

df['new'] = np.where(mask, s, df['col A'])
print (df)
                 col A         Col Learn               new
0  Learn Science, Math  Learn S, Learn M  Learn S, Learn M
1  Learn Math, English  Learn M, Learn E  Learn M, Learn E
2        Learn Science           Learn S           Learn S
3              Science               val           Science
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...