Группировка по столбцу даты и применение функции для группировки по - PullRequest
0 голосов
/ 29 мая 2019

Я пытался задать вопрос ранее, но удалил, чтобы я мог задать более четко и показать, что я пытаюсь, если он близко.

Мой образец df

    day         a   b
  5/11/19       3   1
  5/11/19       4   6
  5/12/19       1   2
  5/12/19       5   9
  5/13/19      11   14

Я хочу сгруппировать по столбцу дня и хочу, чтобы новый df вычислял для col a и col b количество значений <10 / все значения для этого дня и столбца (a или b) как %. Так как есть множество строк на каждый день. </p>

Я пытаюсь что-то вроде

def calc_(group_df):
result = dict()
result["x"] = group_df[(group_df.x) < 10] / len(group_df.x)
result["y"] = group_df[(group_df.y) < 10] / len(group_df.y)
return pd.Series(result, index=["x", "y"])

, а затем

df.groupby("day").apply(calc)

но я получаю ошибку

Ошибка типа: не удалось обработать 163143 со значениями блока, неподдерживаемыми типами операндов для /: 'str' и 'int'

Я что-то упустил?

Я хочу, чтобы мой окончательный вывод

     day         a   b
  5/11/19       .3  .1
  5/12/19       .5  .9
  5/13/19       .1  .4

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

1 Ответ

1 голос
/ 29 мая 2019

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

Использование этого фрейма данных в качестве ввода:

       day   a   b
0  5/11/19   3   1
1  5/11/19  11   3
2  5/12/19   5   9
3  5/13/19  11  14

def calc(df):

    len_a_under_10 = (df['a'] < 10).sum() / len(df['a'])
    len_b_under_10 = (df['b'] < 10).sum() / len(df['b'])

    df['a_under_10'] = len_a_under_10
    df['b_under_10'] = len_b_under_10

return df

df.groupby('day').apply(calc)

Дает:

       day   a   b  a_under_10  b_under_10
0  5/11/19   3   1         0.5         1.0
1  5/11/19  11   3         0.5         1.0
2  5/12/19   5   9         1.0         1.0
3  5/13/19  11  14         0.0         0.0
...