【问题标题】:Iterate list by first element then first AND second element etc按第一个元素然后第一个和第二个元素等迭代列表
【发布时间】:2020-01-22 17:38:56
【问题描述】:

我有一个数据框列表,每个数据框都有一个分类属性“landType”。

df_list = [df1,df2,df3]

df1.landType.unique() == A,B
df2.landType.unique() == B
df3.landType.unique() == B,C

我想创建一个新列表,其中包含唯一值的数量,但考虑到以前的迭代,即:

len(df1.landType.unique()) == 2
len(df1 AND df2.landType.unique()) == 2
len(df1 AND df2 AND df3.landType.unique()) == 3

output_list = [2,2,3]

【问题讨论】:

  • 欢迎堆栈溢出!为您已经尝试过的内容添加一些代码会对您有所帮助,以制作完整的minimal reproducible example,以便我们知道如何最好地提供帮助
  • 看看itertools.accumulate
  • 我想我应该以不同的方式问这个问题 - 我用一个更明确的例子更新了它 - 不过感谢你对以前版本的回答!
  • 分类属性 'landType' 一个属性?你的意思是一个专栏?你能分享一下 DataFrame 的样子吗?请参阅:minimal reproducible example考虑到以前的迭代是什么意思?在我看来,您只是在合并列,然后计算唯一值的数量,对吗?

标签: python list


【解决方案1】:

Python 3.8 中的新赋值表达式可用于保持目前看到的所有xs 的运行总数。

>>> a = [1, 2, 3]
>>> y = 0
>>> [(y := y + x) for x in a]
[1, 3, 6]

新语法的这种应用概括了itertools.accumulate 已经做的事情。

>>> from itertools import accumulate
>>> list(accumulate(a))
[1, 3, 6]

【讨论】:

    【解决方案2】:

    拥有一个新的空白列表 b 的这种非常基本的方法,遍历列表 a 中的所有项目,将累积值添加到每个元素并继续附加到 b 将为您提供结果(除了 itertools 方法)

    a = [1,2,3]
    b = [] 
    acum = 0
    for i in a:
        b.append(i+acum)
        acum += i
    print (b)
    [1, 3, 6]
    

    【讨论】:

      【解决方案3】:

      答案是这样的:

      out_put_list = [len(pd.concat(df_list[y][0:i+1]).reset_index().drop('index',axis=1)['landType'].unique())
                              for i in range(len(df_list[y]))]
      

      pd 是熊猫模块

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多