我有以下用例,其中我有一个带有系列/列的列的pandas DataFrame。所有系列/列表的长度各不相同,但我想要接受此列表的前5个元素并将它们设置为自己的列。
首先,我尝试使用系列/列表的一部分设置一个新列(例如df.full_column.tolist()[:5]),但是我收到一个错误:
ValueError: Length of values does not match length of index
所以我基本上有两个问题:
谢谢!
你可以使用pd.Series.values.tolist()
并将其传递给pd.DataFrame
。该解决方案适用于列表列表中任何最大长度的列表。
如果您愿意,可以通过df.drop
删除不需要的列。
建立
import pandas as pd
lst = [[[1]],
[[1, 2]],
[[1, 2, 3]],
[[1, 2, 3, 4, 5]],
[[1, 2, 3, 4]]]
df = pd.DataFrame(lst)
df['Col'] = 5
# 0 Col
# 0 [1] 5
# 1 [1, 2] 5
# 2 [1, 2, 3] 5
# 3 [1, 2, 3, 4, 5] 5
# 4 [1, 2, 3, 4] 5
解
df2 = df.drop(0, 1).join(pd.DataFrame(df[0].values.tolist()))
# Col 0 1 2 3 4
# 0 5 1 NaN NaN NaN NaN
# 1 5 1 2.0 NaN NaN NaN
# 2 5 1 2.0 3.0 NaN NaN
# 3 5 1 2.0 3.0 4.0 5.0
# 4 5 1 2.0 3.0 4.0 NaN
说明
pd.DataFrame
接受一个可变长度列表作为输入。df[0].values.tolist()
通过系列的numpy表示返回锯齿状列表。join
默认加入索引。让我们使用str访问器和assign
索引:
df.assign(**pd.DataFrame(df[0].str[:5].tolist()).add_prefix('value_'))
输出:
0 value_0 value_1 value_2 value_3 value_4
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4
1 [100, 101, 102, 103, 104, 105, 106, 107, 108, ... 100 101 102 103 104
2 [1000, 1001, 1002, 1003, 1004, 1005, 1006, 100... 1000 1001 1002 1003 1004