Как заменить значение в Pandas Column несколько раз? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть фрейм данных df1

Questions                             Purpose
what is scientific name of <input>    scientific name
what is english name of <input>       english name

И у меня есть 2 списка, как показано ниже:

name1 = ['salt','water','sugar']
name2 = ['sodium chloride','dihydrogen monoxide','sucrose']

Я хочу создать новый фрейм данных, заменив <input> значениямив списке зависит от цели.

если целью является английское имя, замените <input> на значения в name2, в противном случае замените <input> на name1.

Ожидаемый результатDataFrame:

Questions                                   Purpose
what is scientific name of salt             scientific name
what is scientific name of water            scientific name
what is scientific name of sugar            scientific name
what is english name of sodium chloride     english name
what is english name of dihydrogen monoxide english name
what is english name of sucrose             english name

Мои усилия

questions = []
purposes = []

for i, row in df1.iterrows():
    if row['Purpose'] == 'scientific name':
        for name in name1:
            ques = row['Questions'].replace('<input>', name)
            questions.append(ques)
            purposes.append(row['Purpose'])
    else:
        for name in name2:
           ques = row['Questions'].replace('<input>', name)
           questions.append(ques)
           purposes.append(row['Purpose'])

df = pd.DataFrame({'Questions':questions, 'Purpose':purposes})

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

Я ищу более эффективное решение, которое может избавиться от петли for.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я сделал что-то вроде ниже, используя pd.concat(), вы можете попробовать:

names = name1+name2
df_new = pd.concat([df.loc[df.Purpose.eq('scientific name')]]*len(name1))\
    .append(pd.concat([df.loc[df.Purpose.eq('english name')]]*len(name2)),ignore_index=True)

for e,i in enumerate(names):
    df_new.Questions.loc[e]=df_new.Questions.loc[e].replace('<input>',i)
print(df_new)

                                     Questions          Purpose
0              what is scientific name of salt  scientific name
1             what is scientific name of water  scientific name
2             what is scientific name of sugar  scientific name
3      what is english name of sodium chloride     english name
4  what is english name of dihydrogen monoxide     english name
5              what is english name of sucrose     english name
0 голосов
/ 11 февраля 2019

Один из способов сделать это - перебрать Questions со списком и заменить <input> на соответствующий name.Чтобы повторить каждое Question столько раз, сколько полей находятся в namesx, вы можете использовать itertools.cycle:

from itertools import cycle

names = [name1, name2]
new = [[i.replace('<input>', j), purpose] 
                       for row, purpose, name in zip(df.Questions, df.Purpose, names) 
                       for i,j in zip(cycle([row]), name)]

pd.DataFrame(new, columns=df.columns) 

                                    Questions          Purpose
0              what is scientific name of salt  scientific name
1             what is scientific name of water  scientific name
2             what is scientific name of sugar  scientific name
3      what is english name of sodium chloride     english name
4  what is english name of dihydrogen monoxide     english name
5              what is english name of sucrose     english name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...