【问题标题】:Making lists based on values in column根据列中的值制作列表
【发布时间】:2019-07-17 06:28:34
【问题描述】:

我有一个有趣的案例。在FID2 列中,我有一些值,基于每个我想创建一个列表。 Ncircles 列确定列表。 例如:

  • 如果Ncircles 中有值0,我想根据与[i] 同一行中的FID2 中的值创建一个列表,其中i 等于FID2 .
  • 如果Ncircles 中有值1,我想创建一个基于 FID2 中的值与[i-1, i, i +1] 在同一行,其中i 等于FID2
  • 如果Ncircles 中有值3,我想创建一个基于 FID2 中的值与[i-3, i-2, i -1 i, i+1, i+2, i +3] 在同一行,其中i 等于FID2

这是一个df的例子:

          FID2  Ncircles
0        50141         0
1        56188         1
2        75035         0
3        94937         3

最终列表可以写在同一个列表中。你对如何做到这一点有什么建议吗?

预期的输出将是一个新列表:

Newlist = [50141, 56187, 56188, 56188, 75035, 94934, 94935, 94936, 94937, 94938, 94939, 94940]

【问题讨论】:

  • 提供预期输出
  • 性能重要吗?
  • 如果你指的是时间,那么没有。它不是。你的解决方案很棒,但如果我在 [i-2490,i-2489,i-2488,i-1,i+1,i+2488,i+2489,i+2490] 案例中失败了
  • but if fails me - 你的意思是得到负数?
  • 没有。范围功能不起作用。我将该解决方案与预定义的函数和if 命令相结合,它可以工作!

标签: python pandas list


【解决方案1】:

在列表推导中使用range 进行展平:

Newlist = [c for a, b in zip(df['FID2'], df['Ncircles']) for c in range(a-b, a+b+1)]
print (Newlist)
[50141, 56187, 56188, 56189, 75035, 94934, 94935, 94936, 94937, 94938, 94939, 94940]

【讨论】:

    【解决方案2】:

    一种使用 apply 的方法:

    def create_list(ncircles, fid2):
        return [fid2 + k for k in range(-ncircles, ncircles+1)]
    
    df['fid2list'] = df.apply(axis=1, func=lambda l: create_list(l.Ncircles, l.FID2))
    
        FID2  Ncircles                                           fid2list
    0  50141         0                                            [50141]
    1  56188         1                              [56187, 56188, 56189]
    2  75035         0                                            [75035]
    3  94937         3  [94934, 94935, 94936, 94937, 94938, 94939, 94940]
    

    并且列表可以与np.concatenate(df['fid2list'].values)组合:

    array([50141, 56187, 56188, 56189, 75035, 94934, 94935, 94936, 94937,
       94938, 94939, 94940])
    

    【讨论】:

    • 这很好用!但它对我来说失败了,如果我有条件,例如[i-2490,i-2489,i-2488,i-1,i+1,i+2488,i+2489,i+2490] 因为我不能把它放在 range 函数中。能否请您提出如何处理此问题的建议?
    • @energyMax 我不太了解[i-2490,i-2489,i-2488,i-1,i+1,i+2488,i+2489,i+2490] 中的逻辑/模式。省略 i-1i+1 部分,它就像 return [fid2 - (2487 - k) for k in range(-ncircles, ncircles+1)] (或类似的东西) 一样简单。在该示例中,ncircles 的值是多少?
    • 如果可以的话,如果我有一个[(50141, 56187, 56188, 56189), 75035, 94934, 94935] 列表,我如何在没有() 的情况下提取单个list 中的值?
    • @energyMax 检查这个:stackoverflow.com/questions/2158395/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2014-09-15
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多