【问题标题】:List Comprehension to old fashioned for loop对老式 for 循环的列表理解
【发布时间】:2020-06-13 22:41:43
【问题描述】:

我试图更好地理解编写 for 循环的列表理解方式,但我仍然对我得到的语义错误感到困惑!

这个是列表推导!

df["year"] = [int(s.split("-")[1]) for i in df["Month"]]
df["month"] = [str(s.split("-")[0]) for i in df["Month"]]

这是正确的我得到的!从90年代到2020年的每一年!我只显示 15 个!

现在我正在尝试用老式的 for 循环方式编写相同的东西!

for i in df['Month']:
    df['year'] = int((i.split("-")[1]))

如您所见,我得到的是重复值,而不是第一张图片中从头到尾的所有年份!

【问题讨论】:

  • 您似乎在for 循环中设置df['month'],但随后打印出df["year"]。是这个问题吗?
  • @Sam 我正在尝试创建一个名为“year”的新列,它从“Month”列中获取年份!还有“月”作为一个新列,它从“月”列中获取月份!这就是我与破折号分开的原因!
  • 你能显示你的输入数据框吗?
  • 我刚刚编辑了您上面提到的内容,您是对的,是的,我现在向您展示数据框!
  • @Sam 我添加了主 DF!

标签: python loops dataframe list-comprehension


【解决方案1】:

我认为问题在于您在每个循环中设置了一个值:df['year'] = int((i.split("-")[0]))。在您的列表理解中,您将 df["year"]df["month"] 设置为列表,而不是单个值。您需要为您在数据框中设置的内容添加另一个索引,或者构建一个列表,用于在df 中设置该列。如上所述,年不是拆分中的第二个值 [1] 而不是 [0] 吗?另外,使用i 作为元素是不好的做法,因为i 通常被认为是一个索引,而这里是整个单元格AUG-90

如果你真的想要一个 for 循环,你可以使用这个:

df['Month'] = [
    'Apr-90',
    'May-90',
    'Jun-90',
    'Jul-90',
    'Aug-90',
    'Jan-91',
    'Feb-91',
]
years = []
for i in df['Month']:
    years.append(int((i.split("-")[1])))
df['year'] = years
>>> print(df)
Month  year
0  Apr-90    90
1  May-90    90
2  Jun-90    90
3  Jul-90    90
4  Aug-90    90
5  Jan-91    91
6  Feb-91    91

【讨论】:

  • 它是 [1] 我刚刚编辑它是一个错字,在我的实际代码中我有它 [1]
  • 好的,但主要问题是每次循环都将year 列设置为单个值!
  • 我知道我实际上并没有迭代一年[1],你能告诉我怎么做吗,我现在似乎无法掌握它!我实际上只是在迭代该列的最后一个值,显然是 2020(20)!
  • 您需要df['year'][i] = int((i.split("-")[1])) 之类的东西吗?或者在i'th 迭代的year 列中设置i'th 值的其他一些特定于数据框的方法。
  • 数据框有 360 个项目,更具体地说,它有从 1990 年 4 月到 2020 年 4 月的所有月份,所以 30*12 =360,所以我需要从1990 年 4 月到 2020 年 4 月结束,更像是上面在列表理解代码下上传的第二张图片,这就是我期待得到的!
【解决方案2】:

看起来像拆分后索引中的代码拼写错误:

for i in df['Month']:
    df['year'] = int((i.split("-")[1]))

【讨论】:

  • 我运行这段代码实际上是页面中的一个错字!我仍然遇到与上述相同的问题!
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多