[英]Can a list comprehension be divided in two lists?
我想我已经理解了单行 for 循环的想法,但现在我遇到了问题。 我知道我可以使用如下定义一个 dataframe 列:
df = pd.DataFrame(columns=["columnA"])
list = [0, 1, 2, 3, 4]
df["columnA"] = [i for i in list]
现在我的问题是:是否可以在一行 for 循环中定义 2 列?
我试过这个:
df["columnA"], df["columnB"] = [i, i**2 for i in list]
df["columnA"], df["columnB"] = [[i, i**2] for i in list]
这些都不起作用。 我正在使用 Python 3.10
您必须zip
您的 output:
df['A'], df['B'] = zip(*[(i, i**2) for i in lst])
print(df)
# Output
A B
0 0 0
1 1 1
2 2 4
3 3 9
4 4 16
您还可以使用np.array
:
df[['A', 'B']] = np.array([(i, i**2) for i in lst])
现在您的代码正在覆盖 A 列中的内容。
df["columnB"], df['columnA'] = [i**2 for i in list], [i for i in list]
上面的答案比我的好多了。 今天学到了新东西。
这是我对您的问题的解决方案:
1:栏目创建
使用 dataframe 创建列,这比以后添加列快得多
list = [0, 1, 2, 3, 4]
df = pd.DataFrame({
"columnA":list,
"columnB":[i**2 for i in list]
})
通过使用%%timeit
对其进行测试,我们获得:
161 µs ± 4.41 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
现在,让我们检查您的版本:
df = pd.DataFrame(columns=["columnA"])
list = [0, 1, 2, 3, 4]
df["columnA"] = [i for i in list]
df["columnB"] = [i**2 for i in list]
1.58 ms ± 72.3 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
您的版本或多或少慢了 10000 倍。
2:使用.assign
如果在创建 dataframe 时无法创建所有列,则可以使用 .assign 通过单个方法创建多个列:
df = pd.DataFrame({
"columnA" :[i for i in list]
}).assign(
columnB = [i**2 for i in list],
columnC = [i**3 for i in list]
)
3:单为
如果你真的想使用单个for,你可以先构建数据,然后构建dataframe:
data = [
{
"columnA":i,
"columnB":i**2
} for i in list
]
df = pd.DataFrame(data)
最后, list
已经是 python 关键字,所以你应该避免覆盖它。 您将无法访问实际的 function 和类型,因此这些将不起作用:
list(iter([1,2,3]))
(将可互操作的对象转换为列表)
isinstance([1,2,3],list)
(检查变量是否为列表类型)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.