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

时间:2018-10-06 07:17:54

标签: 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

是否可以在同一时间创建第4列,而其他列在数据中创建,其长度与此数据帧的最长列(第3列)的长度相同?

此列的数据无关紧要。假设它是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

在我的脚本中,数据框每次都在变化。这意味着最长的列会随之变化。

感谢阅读

7 个答案:

答案 0 :(得分:6)

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

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

这将自动为您提供一列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

请注意,此答案与此处的其他答案(例如@jpp和@Cleb)相比,通用性较低,因为它只会填充NaN。如果要使用NaN以外的其他默认填充值,则应使用其答案之一。

答案 1 :(得分:5)

您可以追加到列表,然后立即将其提供给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

答案 2 :(得分:2)

您不清楚同时是什么意思,但可以使用以下方法:

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

答案 3 :(得分:1)

如果要在创建DataFrame时执行此操作,只需将调用链接到assign

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

     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

答案 4 :(得分:0)

您可以进行def(阅读评论):

def f(df):
   l=[8]*df[max(df,key=lambda x:df[x].count())].count()
   df[3]=l+[np.nan]*(len(df)-len(l))
   # the above two lines can be just `df[3] = another solution currently for this problem`
   return df
dataFrame = f(pandas.DataFrame(data).transpose())

那么现在:

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

答案 5 :(得分:0)

如果您要同时运行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()

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

答案 6 :(得分:0)

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

 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