Как рассчитать процентную разницу между двумя фреймами данных с Pandas? - PullRequest
0 голосов
/ 22 марта 2019

Я использую pandas, и я выполняю некоторые вычисления и преобразования, где я получаю два фрейма данных, которые более или менее похожи на это:

ID      'abc'     'def'
Total     4         5
Slow      0         0
Normal    1         2
Fast      3         3

ID      'abc'     'def'
Total     3         4
Slow      0         0
Normal    0         1
Fast      3         3

Теперь, учитывая эти два фрейма данных, я хочу сгенерировать третий фрейм данных, который каким-то образом возвращает, какой процент первого фрейма данных выполняет второй. Я хочу, чтобы результаты были такими:

ID      'abc'     'dfe'
Total   75.0%      80.0%
Slow     None      None
Normal   0.0%      50.0%
Fast    100.0%     100.0%

Если в первом кадре данных есть 0, то в результирующем кадре данных мы устанавливаем для этой ячейки значение None или что-то еще. Идея заключается в том, что в конце я запишу результаты в файл Excel, поэтому я хочу, чтобы ячейки с None были пустыми в Excel. Любые идеи, как сделать это в Python, используя pandas?

Ответы [ 2 ]

4 голосов
/ 22 марта 2019

Вы можете просто разделить df2 на df1 на интересующие колонки:

df2.loc[:,"'abc'":] = df2.loc[:,"'abc'":].div(df1.loc[:,"'abc'":]).mul(100)

     ID     'abc'  'dfe'
0   Total   75.0   80.0
1    Slow    NaN    NaN
2  Normal    0.0   50.0
3    Fast  100.0  100.0

Обновление

Чтобы отформатировать как указано, вы можете сделать:

df2.loc[:,"'abc'":] = df2.where(df2.loc[:,"'abc'":].isna(), 
                                df2.round(2).astype(str).add('%'))

      ID    'abc'   'dfe'
0   Total   75.0%   80.0%
1    Slow     NaN     NaN
2  Normal    0.0%   50.0%
3    Fast  100.0%  100.0%

Учитывая, что нет десятичных знаков, кроме .0, round(2) не влияет на отображаемые числа с плавающей запятой, однако, как только появится число с большим количеством знаков после запятой после разделения, вы увидите 2 десятичные позиции для всех чисел.

0 голосов
/ 22 марта 2019

Pandas предлагает несколько возможностей для прямого указания стиля в выходном файле Excel .Он ограничен, но, к счастью, для вас есть опция числового формата.

import pandas as pd

# Initialize example dataframes
df1 = pd.DataFrame(
    data=[[4, 5], [0, 0], [1, 2], [3, 3], [3, 3]],
    index=['Total', 'Slow', 'Normal', 'Fast', 'Fast'],
    columns=['abc', 'def'],
)
df2 = pd.DataFrame(
    data=[[3, 4], [0, 0], [0, 1], [3, 3], [3, 3]],
    index=['Total', 'Slow', 'Normal', 'Fast', 'Fast'],
    columns=['abc', 'def'],
)

result_df = df2 / df1

# Change rows index into data column (to avoid any chance of having non-unique row index values,
# since the pandas styler can only handle unique row index)
result_df = result_df.reset_index()

# Write excel output file with number format styling applied
result_df.style.applymap(lambda _: 'number-format: 0.00%').to_excel('result.xlsx', engine='openpyxl', index=False)
...