根据每个用户在熊猫中的值,创建一个包含数字序列的长数据框

时间:2018-06-29 04:24:11

标签: python pandas dataframe

假设我有一个像这样的数据框:

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 :(得分:0)

使用理解力

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