Создайте длинный фрейм данных, содержащий числовые последовательности в соответствии со значением каждого пользователя в пандах - PullRequest
0 голосов
/ 29 июня 2018

Предположим, у меня есть фрейм данных:

import pandas as pd
df = pd.DataFrame({"user_id": [1, 5, 11],
                   "user_type": ["I", "I", "II"],
                   "joined_for": [1.4, 9.4, 18.1]})

Теперь я бы хотел:

  1. Возьмите каждого пользователя joined_for и получите потолочное целое число.
  2. На основе целого числа создайте новый фрейм данных, содержащий числовые последовательности, где максимум - это максимальный номер.

Вот как я это делаю сейчас:

import math
new_df = pd.DataFrame()
for i in range(df.shape[0]):
    ceil_num = math.ceil(df.iloc[i]["joined_for"])
    new_df = new_df.append(pd.DataFrame({"user_id": df.iloc[i]["user_id"],
                                         "joined_month": range(1, ceil_num+1)}),
                           ignore_index=True)
new_df = new_df.merge(df.drop(columns="joined_for"), on="user_id")

new_df - это то, что я хочу, но это так много времени, когда много пользователей, а число joined_for может быть больше. Есть ли лучший способ сделать это? Быстрее или аккуратнее?

1 Ответ

0 голосов
/ 29 июня 2018

Используя понимание

pd.DataFrame([
    [t.user_id, m, t.user_type] for t in df.itertuples(index=False)
    for m in range(1, math.ceil(t.joined_for) + 1)
], columns=['user_id', 'joined_month', 'user_type'])

    user_id  joined_month user_type
0         1             1         I
1         1             2         I
2         5             1         I
3         5             2         I
4         5             3         I
5         5             4         I
6         5             5         I
7         5             6         I
8         5             7         I
9         5             8         I
10        5             9         I
11        5            10         I
12       11             1        II
13       11             2        II
14       11             3        II
15       11             4        II
16       11             5        II
17       11             6        II
18       11             7        II
19       11             8        II
20       11             9        II
21       11            10        II
22       11            11        II
23       11            12        II
24       11            13        II
25       11            14        II
26       11            15        II
27       11            16        II
28       11            17        II
29       11            18        II
30       11            19        II
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...