L oop через строку данных, используя ключи словаря, и вывести значение при совпадении - PullRequest
0 голосов
/ 04 февраля 2020

Словарь -

theDict = {'Apple': '50',
           'Mango': '70',
           'Banana': '20'}

Фрейм данных -

df=pd.DataFrame({'id':[1,2,3],
         'var1':['Apple','Papaya','Banana'],
          'var2':['Papaya','Mango','Apple'],
         'var3':['Banana','Guava','Grapes']})

Если элемент словаря, например, Apple, присутствует в строке данных, то на выходе должен быть новый столбец с значение 50.

Если в строке два фрукта, например, Man go и Apple, то выходной сигнал должен быть 50 + 70 перед этой строкой

Образец вывода -

df=pd.DataFrame({'id':[1,2,3],
         'var1':['Apple','Papaya','Banana'],
          'var2':['Papaya','Mango','Apple'],
         'var3':['Banana','Guava','Grapes']
          'Output_var':['50','50+70','20']})

Создание фрейма данных со значением True или False, если значение присутствует или нет

m = df.isin(theDict)
print (m)

Теперь не уверен, как l oop фрейм данных и создать новый столбец.

Любой другой подход приветствуется!

Я думал о преобразовании фреймов данных в массив numpy и использовании l oop, но мой набор данных очень большой, и я не уверен, является ли он оптимальный способ сделать это

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Сначала мы используем melt, чтобы разворачивать ваши данные в строки.

Затем мы используем Series.map, чтобы сопоставить ваш словарь с фруктами.

Наконец, мы используем GroupBy.sum и join:

dfm = df.melt('id', ['var1', 'var2', 'var3'])
dfm['Output_var'] = dfm['value'].map(theDict).astype(float)
df = df.set_index('id').join(dfm.groupby('id')['Output_var'].sum()).reset_index()

   id    var1    var2    var3  Output_var
0   1   Apple  Papaya  Banana        70.0
1   2  Papaya   Mango   Guava        70.0
2   3  Banana   Apple  Grapes        70.0
1 голос
/ 04 февраля 2020

Используйте replace и выражение генератора (или список понимания) с pd.to_numeric в каждом столбце. Наконец, вызовите sum на выходе выражения генератора

cols = ['var1', 'var2','var3']
df['output_var'] = sum(pd.to_numeric(col, errors='coerce').fillna(0) 
                                for col in map(df.replace(theDict).get, cols))

In [27]: df
Out[27]:
   id    var1    var2    var3  output_var
0   1   Apple  Papaya  Banana        70.0
1   2  Papaya   Mango   Guava        70.0
2   3  Banana   Apple  Grapes        70.0
1 голос
/ 04 февраля 2020

Другой способ состоит в том, чтобы просто отобразить вдоль вашей оси, используя команду apply, которая теперь принимает аргумент axis.

df['vals'] = df.select_dtypes("object").apply(lambda x: x.map(theDict), axis=1).fillna(0).astype(
    int
).sum(axis=1)

   id    var1    var2    var3  vals
0   1   Apple  Papaya  Banana    70
1   2  Papaya   Mango   Guava    70
2   3  Banana   Apple  Grapes    70

, если вы просто хотите объединить значения:

df['vals'] = df.select_dtypes("object").apply(lambda x: x.map(theDict), axis=1).stack(0).groupby(
    level=0
).agg("+".join)

print(df)
   id    var1    var2    var3   vals
0   1   Apple  Papaya  Banana  50+20
1   2  Papaya   Mango   Guava     70
2   3  Banana   Apple  Grapes  20+50
...