Python 同时创建与数据中最长列具有相同长度的列

Python 同时创建与数据中最长列具有相同长度的列,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有以下数据: data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]] dataFrame = pandas.DataFrame(data).transpose() 输出: 0 1 2 0 1.0 1.0 1.0 1 2.0 2.0 2.0 2 3.0 3.0 3.0 3 NaN 4.0 4.0 4 NaN 5.0 5.0 5 NaN NaN 6.0 6 NaN NaN 7.0 是否可以在数

我有以下数据:

data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]]
dataFrame = pandas.DataFrame(data).transpose()
输出:

     0    1    2
0  1.0  1.0  1.0
1  2.0  2.0  2.0
2  3.0  3.0  3.0
3  NaN  4.0  4.0
4  NaN  5.0  5.0
5  NaN  NaN  6.0
6  NaN  NaN  7.0
是否可以在数据中创建其他列的同时创建第四列,其长度与此数据帧的最长列(第三列)相同

这一列的数据无关紧要。假设是8。因此,这是期望的输出可以是:

     0    1    2    3
0  1.0  1.0  1.0  8.0
1  2.0  2.0  2.0  8.0
2  3.0  3.0  3.0  8.0
3  NaN  4.0  4.0  8.0
4  NaN  5.0  5.0  8.0
5  NaN  NaN  6.0  8.0
6  NaN  NaN  7.0  8.0
在我的脚本中,数据帧每次都在变化。这意味着最长的列也会随之变化


感谢阅读

如果您想在创建数据帧时执行此操作,只需将调用链接到
assign

pd.DataFrame(data).T.assign(**{'3': 8})


现在还不完全清楚您同时指的是什么,但以下几点可行:

import pandas as pd

data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]]
# get the longest list in data
data.append([8] * max(map(len, data)))
pd.DataFrame(data).transpose()
屈服

     0    1    2    3
0  1.0  1.0  1.0  8.0
1  2.0  2.0  2.0  8.0
2  3.0  3.0  3.0  8.0
3  NaN  4.0  4.0  8.0
4  NaN  5.0  5.0  8.0
5  NaN  NaN  6.0  8.0
6  NaN  NaN  7.0  8.0

您可以附加到一个列表中,该列表随后立即向
pd.DataFrame
构造函数提供:

import pandas as pd

data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]]

df = pd.DataFrame(data + [[8]*max(map(len, data))]).transpose()

print(df)

     0    1    2    3
0  1.0  1.0  1.0  8.0
1  2.0  2.0  2.0  8.0
2  3.0  3.0  3.0  8.0
3  NaN  4.0  4.0  8.0
4  NaN  5.0  5.0  8.0
5  NaN  NaN  6.0  8.0
6  NaN  NaN  7.0  8.0
但这是低效的。Pandas使用NumPy来保存基础序列,将序列设置为常量值非常简单和有效;您可以简单地使用:

df[3] = 8

您可以执行
def
(阅读注释):

现在:

print(dataFrame)
返回:

     0    1    2  3
0  1.0  1.0  1.0  8
1  2.0  2.0  2.0  8
2  3.0  3.0  3.0  8
3  NaN  4.0  4.0  8
4  NaN  5.0  5.0  8
5  NaN  NaN  6.0  8
6  NaN  NaN  7.0  8

如果您的意思是在运行
pd.DataFrame
的同时,必须在将数据加载到帧之前对其进行预处理

data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]]

longest = max(len(i) for i in data)
dummy = [8 for i in range(longest)] #dummy data filled with 8
data.append(dummy)

dataFrame = pd.DataFrame(data).transpose()

上面的示例获取列表中最长的元素,并在创建数据帧之前创建一个要添加到其中的虚拟元素。

这与@jpp、@Cleb的答案非常相似,可能还有其他一些答案,只是稍微简单一些:

data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]] + [[]]
这将自动为您提供一列与最长列n长度相同的NaN,因此您不需要额外计算最长列的长度。结果数据帧:

     0    1    2   3
0  1.0  1.0  1.0 NaN
1  2.0  2.0  2.0 NaN
2  3.0  3.0  3.0 NaN
3  NaN  4.0  4.0 NaN
4  NaN  5.0  5.0 NaN
5  NaN  NaN  6.0 NaN
6  NaN  NaN  7.0 NaN
 pd.DataFrame(data + [[np.hstack(data).max() + 1] * len(max(data))]).T

     0    1    2    3
0  1.0  1.0  1.0  8.0
1  2.0  2.0  2.0  8.0
2  3.0  3.0  3.0  8.0
3  NaN  4.0  4.0  8.0
4  NaN  5.0  5.0  8.0
5  NaN  NaN  6.0  8.0
6  NaN  NaN  7.0  8.0

请注意,这个答案没有这里的其他答案(如@jpp&@Cleb)那么笼统,因为它只会填充NAN。如果您想要一些非NaN的默认填充值,您应该使用它们的答案之一。

一种解决方案是向传递到数据帧的列表中添加元素:

     0    1    2   3
0  1.0  1.0  1.0 NaN
1  2.0  2.0  2.0 NaN
2  3.0  3.0  3.0 NaN
3  NaN  4.0  4.0 NaN
4  NaN  5.0  5.0 NaN
5  NaN  NaN  6.0 NaN
6  NaN  NaN  7.0 NaN
 pd.DataFrame(data + [[np.hstack(data).max() + 1] * len(max(data))]).T

     0    1    2    3
0  1.0  1.0  1.0  8.0
1  2.0  2.0  2.0  8.0
2  3.0  3.0  3.0  8.0
3  NaN  4.0  4.0  8.0
4  NaN  5.0  5.0  8.0
5  NaN  NaN  6.0  8.0
6  NaN  NaN  7.0  8.0
如果要修改数据,只需:

data = [[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7]]
data = data + [[np.hstack(data).max() + 1] * len(max(data))]

pd.DataFrame(data).T

如果在
第2列中有
NaN
值,那么在这种情况下长度应该是7或6?长度应该是6。我甚至没想到。谢谢,为什么要同时创建它?补充声明的问题是什么?恐怕不可能了。或者首先将列添加到
data
。之后,太晚了!您已经有了数据帧。我不明白为什么在创建df时存在列而不是在创建df后添加列如此重要。对不起,这对我来说没有意义。谢谢你的回答。但是,这不会在创建前三列的同时创建新列。同时创建
数据
变量。/同时创建其他列created@jxpython:不确定这可能是什么样子,因为在创建数据帧之前必须操作
数据
(就像我做的那样)或者随后操纵数据帧(如其他答案中所示)。至少我目前没有看到其他选择,因为在某个时候,人们必须找到最长的子列表…@JohnE:谢谢,是的,这将是另一个选择。只要看看jpp在一行中表达了上面的解决方案(也应该这样做:),我猜这与问题中描述的最接近。但是如果没有OP的进一步反馈,就很难改进现有答案(您也可以添加您的答案!?)。好的,谢谢。我将继续添加我的,尽管它与您的或@jpp的(只是稍微简单一点)没有本质上的不同@JohnE:正确,OP需要进一步说明;我喜欢这个解决方案(也被投了赞成票)。我们将看看是否会有任何额外的反馈在某一点:)这是我一直在寻找的。非常感谢。