【问题标题】:How to iterate over the entire rows of the dataset and fill the additional column?如何遍历数据集的整行并填充附加列?
【发布时间】:2020-08-26 19:51:41
【问题描述】:

我是python的初学者。我想遍历数据集的整个行并适当地填充下面的列。我需要使用从数据集的第一行开始的 for 循环,并在所有行中执行相同的过程。你能给我足够的指令来使用for循环编写代码吗

date
#0  2016-01-01 05:00:00
#1  2016-01-01 06:00:00
#2  2016-01-01 07:00:00
#3  2016-01-01 08:00:00
#4  2016-01-01 09:00:00
#5  2016-01-01 10:00:00
#6  2016-01-01 11:00:00
#7  2016-01-01 12:00:00
#8  2016-01-01 13:00:00
#9  2016-01-01 14:00:00
#10 2016-01-01 15:00:00
#11 2016-01-01 16:00:00
#12 2016-01-01 17:00:00
#13 2016-01-01 18:00:00
#14 2016-01-01 19:00:00
#15 2016-01-01 20:00:00
#16 2016-01-01 21:00:00
#17 2016-01-01 22:00:00
#18 2016-01-01 23:00:00
#19 2016-01-02 00:00:00
#20 2016-01-02 01:00:00
#21 2016-01-02 02:00:00
#22 2016-01-02 03:00:00
#23 2016-01-02 04:00:00
#24 2016-01-02 05:00:00
#25 2016-01-02 06:00:00
#26 2016-01-02 07:00:00
#27 2016-01-02 08:00:00
#28 2016-01-02 09:00:00
#29 2016-01-02 10:00:00
#30 2016-01-02 11:00:00
#31 2016-01-02 12:00:00
#32 2016-01-02 13:00:00
#33 2016-01-02 14:00:00
#34 2016-01-02 15:00:00
#35 2016-01-02 16:00:00
#36 2016-01-02 17:00:00
#37 2016-01-02 18:00:00
#38 2016-01-02 19:00:00
#39 2016-01-02 20:00:00
#40 2016-01-02 21:00:00
#41 2016-01-02 22:00:00
#42 2016-01-02 23:00:00
#43 2016-01-03 00:00:00
#44 2016-01-03 01:00:00
#45 2016-01-03 02:00:00
#46 2016-01-03 03:00:00
#47 2016-01-03 04:00:00
#48 2016-01-03 05:00:00
#49 2016-01-03 06:00:00
#50 2016-01-03 07:00:00
#51 2016-01-03 08:00:00
#52 2016-01-03 09:00:00
#53 2016-01-03 10:00:00
#54 2016-01-03 11:00:00
#55 2016-01-03 12:00:00
#56 2016-01-03 13:00:00
#57 2016-01-03 14:00:00
#58 2016-01-03 15:00:00
#59 2016-01-03 16:00:00
#60 2016-01-03 17:00:00
#61 2016-01-03 18:00:00
#62 2016-01-03 19:00:00
#63 2016-01-03 20:00:00
#64 2016-01-03 21:00:00
#65 2016-01-03 22:00:00
#66 2016-01-03 23:00:00



 #Column name
    #day1
    #day2
    #day3
    #day4
    #day5
    #day6
    #day7

    i=0
    date_cell = dataset['date'][i]

    day_cell = date_cell.dayofweek
    dataset.iloc[i,day_cell] = 1

【问题讨论】:

  • 欢迎来到 SO!请查看How to Ask 并进行一些研究。具体来说,您能否澄清一下:您希望拥有一个带有“日期”列的熊猫数据框?这些数据来自哪里?您可以使用哪种格式?
  • 感谢您的友好回复。是的,这是 pandas 数据报,并且“日期”列包含在此数据集中。之后,我又添加了 7 列,即第 1 天、第 2 天、第 3 天等等。
  • @Mr.Asif 无论使用天数,您是否总是需要 7 列?例如...您的示例实际上只有 3 天...
  • 是的。但是我的日期栏太大了。像 8398 行。由于这个原因,我这里没有提到完整的专栏

标签: python-3.x pandas datetime for-loop pandas-groupby


【解决方案1】:

您不需要/不想在此处使用 for 循环,而是可以使用 get_dummies 并将结果连接回原始数据框,例如:

开始于:

import pandas as pd

df = pd.DataFrame({'date': pd.date_range('2016-01-01 05:00:00', end='2016-01-03 23:00:00', freq='1H')})

dayofweek 日期时间访问器上应用 pd.get_dummies 并重新索引列,以确保所有 7 天都作为列存在,无论那一天是否实际上在您的日期中,用 0 填写缺少的任何内容,添加前缀到列名并加入到您原来的 DF:

new_df = df.join(
    pd.get_dummies(df['date'].dt.dayofweek + 1)
    .reindex(range(1, 8), axis=1, fill_value=0)
    .add_prefix('day')
)

给你:

                  date  day1  day2  day3  day4  day5  day6  day7
0  2016-01-01 05:00:00     0     0     0     0     1     0     0
1  2016-01-01 06:00:00     0     0     0     0     1     0     0
2  2016-01-01 07:00:00     0     0     0     0     1     0     0
3  2016-01-01 08:00:00     0     0     0     0     1     0     0
4  2016-01-01 09:00:00     0     0     0     0     1     0     0
..                 ...   ...   ...   ...   ...   ...   ...   ...
62 2016-01-03 19:00:00     0     0     0     0     0     0     1
63 2016-01-03 20:00:00     0     0     0     0     0     0     1
64 2016-01-03 21:00:00     0     0     0     0     0     0     1
65 2016-01-03 22:00:00     0     0     0     0     0     0     1
66 2016-01-03 23:00:00     0     0     0     0     0     0     1

如果您绝对必须使用 for 循环(不推荐),那么您可以在一个循环中将列初始化为 0,然后循环遍历日期列并将该行的日期列更新为 1一周中的那一天,例如:

for n in range(1, 8):
    df.loc[:, f'day{n}'] = 0
for idx, date in df['date'].iteritems():
    df.loc[idx, f'day{date.dayofweek + 1}'] = 1

【讨论】:

  • 非常感谢。感谢您的友好回复。但是如果我想使用 for 循环,我应该怎么做?
  • @Mr.Asif 您坚持使用 for 循环有什么特别的原因吗?绝对不需要它,而且非常反熊猫成语......
  • 其实我也想学。这就是为什么我对for_loop非常感兴趣的原因。你能帮我学习一下吗?
  • 您是否熟悉 for 循环?好像不是我建议在没有 pandas 的情况下学习,因为在实践中这样做真的很糟糕……你会学习一种不正确的方法来解决你试图解决的问题。
  • @Mr.Asif 更新为包含 for 循环......只是不要在任何严肃的代码中使用它:)
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2017-07-28
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多