如何以重复相同日期系列的方式对一列进行重新排序?
How can I reorder one column in a way that the same serie of dates is repeated?
事情是这样的。
我正在构建一个数据框,以便我的学生可以在练习中使用它。
这就是我要找的:
id date n
0 2022-01-01 10
0 2022-01-02 30
0 2022-01-03 40
.
.
.
1 2022-01-01 0
1 2022-01-02 5
1 2022-01-03 16
.
.
.
2 2022-01-01 99
2 2022-02-01 100
2 2022-03-01 3300
这是一个非常简单的想法。我有一个面板数据,其中第一列是客户 ID,第二列是购买日期,n 是购买的数量。但是,我没能把第二列整理得井井有条。
这是我最远的距离:
ids = pd.Series(range(100)).repeat(10).reset_index(drop=True)
dates = pd.date_range(start = pd.Timestamp('2022-01-01'),end = pd.Timestamp('2022-01-10')).repeat(100)
purchases = pd.Series(np.random.randint(low=0, high=500, size=100*10))
df = pd.DataFrame(data={'ids':ids, 'dates':dates, 'purchases': purchases}, index=None)
如您所见,我没弄对。这是结果:
ids dates n
0 2022-01-01 10
0 2022-01-01 30
0 2022-01-01 40
.
.
.
关于如何更改列日期以便从 2022-01-01 开始的任何想法,但在第二行中我们需要获取 2022-01-02。所以我一次得到正确的顺序并重复。
这看起来很简单,但我找不到答案。
这会做你想做的事:
start_date = pd.Timestamp("2022-01-01")
purchase_low = 0
purchase_high = 500
num_ids = 100
num_days = 10
ids = np.repeat(np.arange(num_ids), num_days)
dates = np.tile(pd.date_range("2022-01-01", periods=num_days), num_ids)
purchases = np.random.randint(purchase_low, purchase_high, num_ids * num_days)
df = pd.DataFrame({"ids": ids, "dates": dates, "purchases": purchases})
输出:
ids dates purchases
0 0 2022-01-01 193
1 0 2022-01-02 362
2 0 2022-01-03 218
3 0 2022-01-04 395
4 0 2022-01-05 172
.. ... ... ...
995 99 2022-01-06 454
996 99 2022-01-07 342
997 99 2022-01-08 356
998 99 2022-01-09 423
999 99 2022-01-10 104
[1000 rows x 3 columns]
您的方法的问题是 .repeat()
重复 每个元素 n
次,而您需要对日期做的是重复 每个序列 的日期 n
次。因此,为什么我对 ids
使用 .repeat
,而对 dates
使用 .tile
。
事情是这样的。
我正在构建一个数据框,以便我的学生可以在练习中使用它。 这就是我要找的:
id date n
0 2022-01-01 10
0 2022-01-02 30
0 2022-01-03 40
.
.
.
1 2022-01-01 0
1 2022-01-02 5
1 2022-01-03 16
.
.
.
2 2022-01-01 99
2 2022-02-01 100
2 2022-03-01 3300
这是一个非常简单的想法。我有一个面板数据,其中第一列是客户 ID,第二列是购买日期,n 是购买的数量。但是,我没能把第二列整理得井井有条。
这是我最远的距离:
ids = pd.Series(range(100)).repeat(10).reset_index(drop=True)
dates = pd.date_range(start = pd.Timestamp('2022-01-01'),end = pd.Timestamp('2022-01-10')).repeat(100)
purchases = pd.Series(np.random.randint(low=0, high=500, size=100*10))
df = pd.DataFrame(data={'ids':ids, 'dates':dates, 'purchases': purchases}, index=None)
如您所见,我没弄对。这是结果:
ids dates n
0 2022-01-01 10
0 2022-01-01 30
0 2022-01-01 40
.
.
.
关于如何更改列日期以便从 2022-01-01 开始的任何想法,但在第二行中我们需要获取 2022-01-02。所以我一次得到正确的顺序并重复。
这看起来很简单,但我找不到答案。
这会做你想做的事:
start_date = pd.Timestamp("2022-01-01")
purchase_low = 0
purchase_high = 500
num_ids = 100
num_days = 10
ids = np.repeat(np.arange(num_ids), num_days)
dates = np.tile(pd.date_range("2022-01-01", periods=num_days), num_ids)
purchases = np.random.randint(purchase_low, purchase_high, num_ids * num_days)
df = pd.DataFrame({"ids": ids, "dates": dates, "purchases": purchases})
输出:
ids dates purchases
0 0 2022-01-01 193
1 0 2022-01-02 362
2 0 2022-01-03 218
3 0 2022-01-04 395
4 0 2022-01-05 172
.. ... ... ...
995 99 2022-01-06 454
996 99 2022-01-07 342
997 99 2022-01-08 356
998 99 2022-01-09 423
999 99 2022-01-10 104
[1000 rows x 3 columns]
您的方法的问题是 .repeat()
重复 每个元素 n
次,而您需要对日期做的是重复 每个序列 的日期 n
次。因此,为什么我对 ids
使用 .repeat
,而对 dates
使用 .tile
。