В качестве альтернативы можно полагаться на декартово произведение, предоставляемое itertools: itertools.product
, что позволяет избежать создания временного ключа или изменения индекса:
import numpy as np
import pandas as pd
import itertools
def cartesian(df1, df2):
rows = itertools.product(df1.iterrows(), df2.iterrows())
df = pd.DataFrame(left.append(right) for (_, left), (_, right) in rows)
return df.reset_index(drop=True)
Быстрая проверка:
In [46]: a = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"])
In [47]: b = pd.DataFrame(np.random.rand(5, 3), columns=["d", "e", "f"])
In [48]: cartesian(a,b)
Out[48]:
a b c d e f
0 0.436480 0.068491 0.260292 0.991311 0.064167 0.715142
1 0.436480 0.068491 0.260292 0.101777 0.840464 0.760616
2 0.436480 0.068491 0.260292 0.655391 0.289537 0.391893
3 0.436480 0.068491 0.260292 0.383729 0.061811 0.773627
4 0.436480 0.068491 0.260292 0.575711 0.995151 0.804567
5 0.469578 0.052932 0.633394 0.991311 0.064167 0.715142
6 0.469578 0.052932 0.633394 0.101777 0.840464 0.760616
7 0.469578 0.052932 0.633394 0.655391 0.289537 0.391893
8 0.469578 0.052932 0.633394 0.383729 0.061811 0.773627
9 0.469578 0.052932 0.633394 0.575711 0.995151 0.804567
10 0.466813 0.224062 0.218994 0.991311 0.064167 0.715142
11 0.466813 0.224062 0.218994 0.101777 0.840464 0.760616
12 0.466813 0.224062 0.218994 0.655391 0.289537 0.391893
13 0.466813 0.224062 0.218994 0.383729 0.061811 0.773627
14 0.466813 0.224062 0.218994 0.575711 0.995151 0.804567
15 0.831365 0.273890 0.130410 0.991311 0.064167 0.715142
16 0.831365 0.273890 0.130410 0.101777 0.840464 0.760616
17 0.831365 0.273890 0.130410 0.655391 0.289537 0.391893
18 0.831365 0.273890 0.130410 0.383729 0.061811 0.773627
19 0.831365 0.273890 0.130410 0.575711 0.995151 0.804567
20 0.447640 0.848283 0.627224 0.991311 0.064167 0.715142
21 0.447640 0.848283 0.627224 0.101777 0.840464 0.760616
22 0.447640 0.848283 0.627224 0.655391 0.289537 0.391893
23 0.447640 0.848283 0.627224 0.383729 0.061811 0.773627
24 0.447640 0.848283 0.627224 0.575711 0.995151 0.804567
Поскольку это описано в десятичном числе как:
Десятичное ключевое слово указывает на 128-разрядный тип данных. По сравнению с типами с плавающей точкой десятичный тип имеет больше точности и меньший диапазон, который делает это подходящим для финансовых и денежных вычислений.
Можно использовать десятичное число следующим образом:
decimal myMoney = 300.5m;
Тип Десятичного значения представляет десятичные числа в пределах от положительных 79,228,162,514,264,337,593,543,950,335 к отрицательным 79,228,162,514,264,337,593,543,950,335. Тип Десятичного значения подходит для финансовых вычислений, требующих больших количеств значительных интегральных и дробных цифр и никаких ошибок округления. Десятичный тип не избавляет от необходимости округление. Скорее это минимизирует ошибки из-за округления.
Я хотел бы указать на этот превосходный ответ подхалима на том, почему дважды не должен использоваться.
Используйте Денежный шаблон от Шаблонов Архитектуры приложений для предприятия; укажите сумму, столь же десятичную и валюта как перечисление.
Десятичное число. Если Вы выбираете дважды, Вы оставляете себя открытыми для погрешностей округления
десятичное число имеет меньший диапазон, но большая точность - таким образом, Вы не теряете все те пенсы со временем!
Полное изложение здесь:
Согласитесь с Денежным шаблоном: Обработка валют является просто слишком громоздкой при использовании десятичных чисел.
При создании класса Валюты можно затем поместить всю логику, касающуюся денег там, включая корректный ToString () - метод, больше управления парсинга значений и лучшего управления подразделений.
Кроме того, с классом Валюты нет никакого шанса неумышленного спутывания денег с другими данными.
Создайте свой собственный класс. Это кажется нечетным, но тип .NET является несоответствующим для покрытия различных валют.