繁体   English   中英

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

[英]Create a column that has the same length of the longest column in the data at the same time

我有以下数据:

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

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

谢谢阅读

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

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

这将自动为您提供NaN列,该列的长度与最长columnn的长度相同,因此您不需要进行额外的计算最长列长度的工作。 结果数据框:

     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以外的其他默认填充值,则应使用其答案之一。

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

这并不完全是在同一时间清除你的意思通过,但下面将工作:

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

如果您要在创建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

你可以做一个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

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

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

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

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM