Pandas Dataframe,使用Pandas为Python中的每一行添加新列和数据范围

5gfr0r5j  于 2023-01-11  发布在  Python
关注(0)|答案(4)|浏览(161)

我有一个 Dataframe 与单列,并希望创建一个新的列称为'小时'的小时0 - 23,但每行。
当前:

AN_LOG_ID
00000001
00000002
00000003

预期输出:(0 - 23代表每行一天中的每小时)

AN_LOG_ID    HOUR
00000001      0
00000001      1
...          ...
00000001      23
00000002      0
00000002      1
...          ...
00000002      23
00000003      0
00000003      1
...          ...
00000003      23
ttisahbt

ttisahbt1#

>>> df = df.assign(HOUR=[range(24)] * len(df)).explode("HOUR", ignore_index=True)
>>> df

   AN_LOG_ID HOUR
0   00000001    0
1   00000001    1
2   00000001    2
3   00000001    3
4   00000001    4
..       ...  ...
67  00000003   19
68  00000003   20
69  00000003   21
70  00000003   22
71  00000003   23

[72 rows x 2 columns]

首先将range(24)作为“HOUR”分配给每一行,然后分解“HOUR”列以将小时分布在其各自的行上。(ignore_index=True将生成索引0、1、2 ...)

j5fpnvbx

j5fpnvbx2#

我们可以使用Index.repeat,然后使用groupby.cumcount来获得HOUR列:

df = df.loc[df.index.repeat(24)]
df = df.assign(HOUR=df.groupby(level=0).cumcount()).reset_index(drop=True)
N_LOG_ID  HOUR
0   00000001     0
1   00000001     1
2   00000001     2
3   00000001     3
4   00000001     4
..       ...   ...
67  00000003    19
68  00000003    20
69  00000003    21
70  00000003    22
71  00000003    23
bzzcjhmw

bzzcjhmw3#

使用十字merge

out = df.merge(pd.DataFrame({'HOUR': range(24)}), how='cross')

输出:

AN_LOG_ID  HOUR
0   00000001     0
1   00000001     1
2   00000001     2
3   00000001     3
4   00000001     4
..       ...   ...
67  00000003    19
68  00000003    20
69  00000003    21
70  00000003    22
71  00000003    23

[72 rows x 2 columns]
bz4sfanl

bz4sfanl4#

基于numpy的另一种可能的解决方案是:

pd.DataFrame(
    np.concatenate(
        (np.repeat(df.values, 24).reshape(-1,1),
         np.tile(np.arange(24), len(df)).reshape(-1,1)), axis=1), 
    columns=['AN_LOG_ID', 'HOUR'])

输出:

AN_LOG_ID HOUR
0   00000001    0
1   00000001    1
2   00000001    2
3   00000001    3
4   00000001    4
..       ...  ...
67  00000003   19
68  00000003   20
69  00000003   21
70  00000003   22
71  00000003   23

相关问题