根据列中的值创建列表

时间:2019-02-23 07:36:50

标签: python pandas list

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

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

这是df的示例:

FID2

最终列表可以全部写在一个列表中。您对如何执行此操作有任何建议吗?

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

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

2 个答案:

答案 0 :(得分:4)

在列表理解中使用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]

答案 1 :(得分:3)

使用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])