Редактировать 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')
Существует три последовательных действия:
- Преобразование данных в
DataFrame
- Транспонирование в (теперь столбцы практически вертикальны)
- Установить
"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 .Надеюсь, поможет!