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

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

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

  1. AN_LOG_ID
  2. 00000001
  3. 00000002
  4. 00000003

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

  1. AN_LOG_ID HOUR
  2. 00000001 0
  3. 00000001 1
  4. ... ...
  5. 00000001 23
  6. 00000002 0
  7. 00000002 1
  8. ... ...
  9. 00000002 23
  10. 00000003 0
  11. 00000003 1
  12. ... ...
  13. 00000003 23
ttisahbt

ttisahbt1#

  1. >>> df = df.assign(HOUR=[range(24)] * len(df)).explode("HOUR", ignore_index=True)
  2. >>> df
  3. AN_LOG_ID HOUR
  4. 0 00000001 0
  5. 1 00000001 1
  6. 2 00000001 2
  7. 3 00000001 3
  8. 4 00000001 4
  9. .. ... ...
  10. 67 00000003 19
  11. 68 00000003 20
  12. 69 00000003 21
  13. 70 00000003 22
  14. 71 00000003 23
  15. [72 rows x 2 columns]

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

展开查看全部
j5fpnvbx

j5fpnvbx2#

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

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

bzzcjhmw3#

使用十字merge

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

输出:

  1. AN_LOG_ID HOUR
  2. 0 00000001 0
  3. 1 00000001 1
  4. 2 00000001 2
  5. 3 00000001 3
  6. 4 00000001 4
  7. .. ... ...
  8. 67 00000003 19
  9. 68 00000003 20
  10. 69 00000003 21
  11. 70 00000003 22
  12. 71 00000003 23
  13. [72 rows x 2 columns]
展开查看全部
bz4sfanl

bz4sfanl4#

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

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

输出:

  1. AN_LOG_ID HOUR
  2. 0 00000001 0
  3. 1 00000001 1
  4. 2 00000001 2
  5. 3 00000001 3
  6. 4 00000001 4
  7. .. ... ...
  8. 67 00000003 19
  9. 68 00000003 20
  10. 69 00000003 21
  11. 70 00000003 22
  12. 71 00000003 23
展开查看全部

相关问题