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需要进一步说明;我喜欢这个解决方案(也被投了赞成票)。我们将看看是否会有任何额外的反馈在某一点:)这是我一直在寻找的。非常感谢。