能否用一行列表推导式为Pandas DataFrame生成两列?
用列表推导式同时定义Pandas DataFrame的两列
当然可以用一行列表推导式同时给DataFrame的两列赋值,你之前的写法问题在于没有正确解包推导式生成的二维结构。
为什么你的写法失败?
- 第一种写法
[i, i**2 for i in list]是语法错误:列表推导式中如果要生成多元素组合,需要用括号把每组元素包起来,比如(i, i**2)或者[i, i**2]。 - 第二种写法
[[i, i**2] for i in list]会生成二维列表(如[[0,0], [1,1], [2,4], ...]),但直接用df["columnA"], df["columnB"] = ...时,Python会尝试把这个长度为5的列表拆给2个变量,因数量不匹配报错。
正确的写法
你可以用zip(*...)解包二维结构,把每组元素的第一个值、第二个值分别提取为两个序列,赋值给对应列:
import pandas as pd lst = [0, 1, 2, 3, 4] # 避免用list作为变量名,会覆盖内置类型 df = pd.DataFrame() # 用zip解包列表推导式的结果 df["columnA"], df["columnB"] = zip(*[(i, i**2) for i in lst])
如果是新建DataFrame,也可以直接用列表推导式生成行数据,一次性创建两列:
df = pd.DataFrame([(i, i**2) for i in lst], columns=["columnA", "columnB"])
验证结果
运行代码后,df内容如下:
| columnA | columnB | |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 4 |
| 3 | 3 | 9 |
| 4 | 4 | 16 |
内容的提问来源于stack exchange,提问作者darioeu
相关产品推荐
相关产品推荐

