Суммируйте строковые данные в процентах с python pandas - PullRequest
2 голосов
/ 24 марта 2020

Учитывая следующие данные:

x = "foo"
y = "bar"
z = "baz"
t1 = "fior"
t2 = "ropir"

d1 = pd.DataFrame(dict(type=[t1] * 4 + [t2] * 4, response=[x, y, x, x, x, z, z, z],))

, который выглядит как

    type response
0   fior      foo
1   fior      bar
2   fior      foo
3   fior      foo
4  ropir      foo
5  ropir      baz
6  ropir      baz
7  ropir      baz

, как его можно суммировать до

d2 = pd.DataFrame(
    dict(
        type=[t1] * 3 + [t2] * 3,
        response=[x, y, z] * 2,
        percentage=[0.75, 0.25, 0, 0.25, 0, 0.75],
    )
)

, что равно

    type response  percentage
0   fior      foo        0.75
1   fior      bar        0.25
2   fior      baz        0.00
3  ropir      foo        0.25
4  ropir      bar        0.00
5  ropir      baz        0.75

1 Ответ

2 голосов
/ 24 марта 2020

Вы можете сделать это, используя groupby и нормализованный value_counts, затем rename Серия, reindex со всеми возможными ответами типа пар, созданными с помощью MultiIndex.from_product из unique значений в каждом столбце, а затем, наконец, reset_index.

d1.groupby('type')['response'].value_counts(normalize=True)\
  .rename('percentage')\
  .reindex(pd.MultiIndex.from_product([d1['type'].unique(), d1['response'].unique()],
                                      names=['type','response']), 
           fill_value=0)\
  .reset_index()

    type response  percentage
0   fior      foo        0.75
1   fior      bar        0.25
2   fior      baz        0.00
3  ropir      foo        0.25
4  ropir      bar        0.00
5  ropir      baz        0.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...