使用列表推导式从列表中映射项?

3

我在循环内使用列表推导式遇到了问题。我想将一个列表的项添加到另一个列表中。

我正在使用 map类zip 作为列表推导式的一部分。

from pandas import Series, DataFrame
import pandas
x = ['a', 'b', 'c', 'd', 'e']
y = [2, 3, 6, 7, 4]
ser = {'A': Series(x), 'B': Series(y)}
df = DataFrame(ser)
targets = df['A'].tolist()
df['A1999'] = [i + 1 for i in df['B']]
df['A2000'] = [i + 2 for i in df['B']]
df['A2001'] = [i + 3 for i in df['B']]
df['A2002'] = [i + 1.7 for i in df['B']]
df['A2003'] = [i + 1.1 for i in df['B']]
y = range(1999, 2004)
gaps = []
for t in targets:
    temp = []
    years = []
    for ele in y:
        target = 'A' + str(ele)
        new = df[target][df['A'] == t].tolist()
        temp.append(new)
        years.append(ele)
        gap = [list(map(list, zip(years, item))) for item in temp]
    gaps.append(gap)

输出结果:

[[[[1999, 3]], [[1999, 4]], [[1999, 5]], [[1999, 3.7000000000000002]],
  [[1999, 3.1000000000000001]]]...

我需要的是:

[[[[1999, 3]], [[2000, 4]], [[2001, 5]], [[2002, 3.7000000000000002]],
  [[2003, 3.1000000000000001]]]...

我应该如何修复列表推导式以添加years list中的所有年份,而不仅仅是第一个(即1999)?

我尝试过这个例子,但我认为我做的是同样的事情:

gap = [[[years[i], x] for i, x in enumerate(y)] for y in temp]

或者

gap = [list(map(list, zip([[y] for y in years], item))) for item in temp]

在你的第二个循环for ele in y中,你给gap赋了很多值,但只添加了最后一个(因为gaps.append(gap)在循环外)。这样做是有意义的吗? - rafaelc
还有一个例子是这个项目 [[2000, 4]],这才是你真正需要的(而不是 [2000, 4])吗? - CristiFati
是的。gaps.append(gap) 必须在外面,否则所有的 gap 都将作为年份的长度,而我想要的是目标的长度。 - estebanpdl
@CristiFati 实际上你是对的。[2000, 4] 应该是正确的输出结果。为了从 gap 中添加结果,我使用了一个空列表 gaps = []。这就是为什么输出结果不同的原因 :S - estebanpdl
我发现很难理解你想做什么。我需要的第一件事是一个可行的示例。你能编辑你的问题让它运行吗? - memebrain
显示剩余4条评论
1个回答

2

将间隙 gap = 替换为以下内容

[list((x,y[0])) for x,y in zip(years,temp)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接