【发布时间】:2020-09-06 09:59:46
【问题描述】:
我想在 DataFrame 中创建一组 n 列,每个列使用列表推导分配一个单独的值。
#My original dataframe
df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
A B
0 1 4
1 2 5
2 3 6
#Expected output -
pd.concat([df, pd.DataFrame(np.tile(np.array([5,10,15,20,25])[:,None], 3).T)], axis=1)
A B 0 1 2 3 4
0 1 4 5 10 15 20 25
1 2 5 5 10 15 20 25
2 3 6 5 10 15 20 25
我需要以这种方式进行 -
#ROUGH structure of the code that I am looking for -
n = "number of columns i want to add"
df[[i for i in range(n)]] = numpyarray #whose shape is (n,3)
我面临的错误很明显-
KeyError: "None of [Int64Index([0, 1, 2], dtype='int64')] are in the [columns]"
#AND
SyntaxError: can't assign to list comprehension
我已经阅读了其他允许添加多列的解决方案,但这个解决方案特别需要一个带有 n 迭代器的循环,因为 -
- 数据框可能需要添加 25 列,这不依赖于值数组
- 值数组可以是 (3, 15),这意味着最后 10 列不会从数组中获取它们的值
- 首选的解决方案是列表推导,因为我将创建的列列表(例如 25 个)来自基于列表推导的迭代器
【问题讨论】:
-
你不能按你的要求去做。 Pandas 不允许一次创建多个列。
-
这是一个答案。但我仍然不确定为什么我的问题已关闭。
-
related ,如果使用循环,可能你可以考虑不转置数组,然后 zip 和迭代 +assign ,类似
arr = np.tile(np.array([5,10,15,20,25])[:,None], 3),for a,b in zip(range(5),arr): df[a] = b -
@AkshaySehgal 我猜您需要形状数组
(3, n)...因为您要分配n列 -
@anky 我浏览了那篇文章,虽然其中大部分对我有用,但问题是我不知道我需要添加多少列。此外,将用于分配值的数组可能表示也可能不表示数据框将具有的列数。因此,如果数组为 (3,10),则可能仅填充数据帧的前 10 个新生成的列,而另外 5 个列仍为 Nan。
标签: python pandas dataframe list-comprehension