Как применить формулу в пандах - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь применить формулу в столбце, но не могу.

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

Date                  2018-04-16 00:00:00
Quantity                         8317.000
Total Value (Lacs)              259962.50

Я хочу применить формулу в Total Value (Lacs) столбце

формула: = [ Total Value (Lacs) multiplied by 100000 ] divided by [Quantity (000’s) multiplied by 100] с использованием панд

Я что-то пробовал

a = df['Total Value (Lacs)']
b = df['Quantity']

c = (a * 100000 / b * 100)
print (c)

or 

df['Price'] = ((df['Total Value (Lacs)']) * 100000 / (df['Quantity']) * 100)
print (df)

ошибка:

TypeError: неподдерживаемые типы операндов для /: 'str' и 'str'

Редактировать

Я пробовал ниже код:

df['Price'] = float((float(df['Total Value (Lacs)'])) * 100000 / float((df['Quantity'])) * 100)    

но получая неправильное значение

price     312567632.6

ожидает

price     31256.76326

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

используйте это:

df['price'] = ((df['Total Value (Lacs)'].apply(pd.to_numeric)) * 100000 / (df['Quantity'].apply(pd.to_numeric)) * 100)
0 голосов
/ 25 августа 2018

Редактировать 1 Ошибка типа означает, что вы пытались применить оператор / к двум строкам.В python такого оператора не определено для типа str, поэтому вам следует преобразовать данные в какой-то числовой тип, float в вашем случае.

Я не совсем понял, как выглядят ваши данные.Но если это так:

df
Out:
Date                   Quantity    Total Value (Lacs) 
2018-04-16 00:00:00    8317.000             259962.50  
2018-04-17 00:00:00    7823.000             234004.50                                

Вы можете преобразовать его в числовой тип, преобразовать все столбцы в правильный тип (я полагаю, что Date столбец является столбцом индекса):

df_float = df.apply(pd.to_numeric)
df_float.dtypes()
Out: 
Quantity              float64
Total Value (Lacs)      int64
dtype: object

В конце концов, вы можете просто иметь дело со столбцами:

df['Price'] =  (df_float['Total Value (Lacs)'] * 100000 
                / df_float['Quantity'] * 100)
df['Price']
Out: 
2018-04-16 00:00:00    319930.7592441217
2018-04-17 00:00:00    334309.8102814262

Другой подход - определить функцию и применить ее к каждой строке с pd.DataFrame.apply:

def get_price(row):
    try:
        price = (float(row['Total Value (Lacs)']) * 100000 
                 / float(row['Quantity']) * 100)
    except (TypeError, ValueError):  # If bad data in this row, can't convert to float
        price = None
    return price

df['Price'] =  df.apply(get_price, axis=1)
df['Price']
Out: 
2018-04-16 00:00:00    319930.7592441217
2018-04-17 00:00:00    334309.8102814262

axis=1 означает «применить к каждой строке»

Если вы транспонировали данные - как в вашем примере, вы должны транспонировать их или применить функцию к каждому столбцу, используя axis=0.

Eidt 2 : похоже, ваши данные - это просто один столбец, и он имеет тип dtype pd.Series.Поэтому, если вы выберете строку с помощью data['Quantity'], вы получите что-то вроде 8317.000 типа str.Конечно, нет способа pd.Series.apply.Таким образом, в этом случае вы можете действовать следующим образом:

index_to_convert = ['Quantity', 'Total Value (Lacs)']
data[index_to_convert] = pd.to_numeric(data[index_to_convert])
  • и только числовые столбцы были преобразованы.Просто выполните формулу:

    data ['Price'] = (data ['Total Value (Lacs)']] * 100000 / data ['Number'] * 100) data Out: Date 2018-04-16 00:00:00 Количество 8317 Общая стоимость (Lacs) 259962 Цена 3.12568e + 08

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

df = data.to_frame().T.set_index('Date')

Существует три последовательных действия:

  1. Преобразование данных в DataFrame
  2. Транспонирование в (теперь столбцы практически вертикальны)
  3. Установить "Date" в качестве столбца индекса

Результаты:

df 
Out: 
                    Quantity Total Value (Lacs)
Date                                           
2018-04-16 00:00:00  8317.00          259962.50

После предыдущих шагов вы можете применить Редактировать 1 код дляваши данные.Также применимо, что в ваших данных более одной серии.

Еще одно: Если ваши данные имеют более одного значения для каждого индекса, то есть несколько величин ets:

data
Out: 
Date                  2018-04-16 00:00:00
Quantity                          8317.00
Total Value (Lacs)              259962.50
Date                  2018-04-17 00:00:00
Quantity                          6434.00
Total Value (Lacs)              230002.50

Вы также можете преобразовать их в pd.DataFrame, шаг за шагом.Сгруппируйте свои данные по индексным записям и примените list к группам:

data.groupby(level=0).apply(list)
Out: 
Date                  [2018-04-16 00:00:00, 2018-04-17 00:00:00]
Quantity                                      [8317.00, 6434.00]
Total Value (Lacs)                        [259962.50, 230002.50]

Затем примените pd.Series к каждой строке:

data.groupby(level=0).apply(list).apply(pd.Series)
Out:                                  0                    1
Date                2018-04-16 00:00:00  2018-04-17 00:00:00
Quantity                        8317.00              6434.00
Total Value (Lacs)            259962.50            230002.50

Транспонирование вернуло DataFrame, установитеСтолбец «Дата» в виде индекса:

series.groupby(level=0).apply(list).apply(pd.Series).T.set_index('Date')
Out:
                    Quantity Total Value (Lacs)
Date                                           
2018-04-16 00:00:00  8317.00          259962.50
2018-04-17 00:00:00  6434.00          230002.50

Применить решение из Редактировать 1 .Надеюсь, поможет!

0 голосов
/ 25 августа 2018

Вы получаете эту ошибку, потому что данные, извлеченные из фрейма данных, являются строками, как показано в вашей ошибке, вам нужно будет преобразовать строку в число с плавающей запятой.

Преобразовать ваш фрейм данных в значения вместо строк.Вы можете достичь этого следующим образом:

values = df.values

Затем вы можете извлечь значения из этого массива.

В качестве альтернативы, после извлечения данных из фрейма данных преобразуйте их в число с плавающей запятой, используя:

b=float(df['Quantity'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...