Pandas groupby对每一组年份应用一个随机日

qrjkbowd  于 2023-02-02  发布在  其他
关注(0)|答案(2)|浏览(129)

我试图在 Dataframe 的每个年份组中生成一个不同的随机日。所以我需要replacement = False,否则会失败。
你不能只添加一列随机数,因为我的年份列表中会有超过365年的年份一旦你达到365年,它就不能再创建任何随机样本,除非替换。
我已经探索了聚集、聚合、应用和转换。我得到的最接近的是这样的:

years = pd.DataFrame({"year": [1,1,2,2,2,3,3,4,4,4,4]})
    years["day"] = 0
    grouped = years.groupby("year")["day"]
    grouped.transform(lambda x: np.random.choice(366, replace=False))

它给出了:

0       8
1       8
2     319
3     319
4     319
5     149
6     149
7     130
8     130
9     130
10    130
Name: day, dtype: int64

但我想要这个:

0       8
1      16
2     119
3     321
4     333
5       4
6      99
7      30
8     129
9     224
10    355
Name: day, dtype: int64
zphenhs4

zphenhs41#

你可以使用你的代码做一些小的修改。你必须指定样本的数量。

random_days = lambda x: np.random.choice(range(1, 366), len(x), replace=False)
years['day'] = years.groupby('year').transform(random_days)

输出:

>>> years
    year  day
0      1   18
1      1  300
2      2  154
3      2  355
4      2  311
5      3   18
6      3   14
7      4  160
8      4  304
9      4   67
10     4    6
t0ybt7op

t0ybt7op2#

对于numpybroadcasting

years["day"] = np.random.choice(366, years.shape[0], False) % 366
​
years["day"] = years.groupby("year").transform(lambda x: np.random.permutation(x))

输出:

print(years)

    year  day
0      1  233
1      1  147
2      2    1
3      2  340
4      2  267
5      3  204
6      3  256
7      4  354
8      4   94
9      4  196
10     4  164

相关问题