Python / Pandas - 当某些列表的值小于5时,如何将列表切割为前5个值?

问题描述 投票:2回答:2

我有以下用例,其中我有一个带有系列/列的列的pandas DataFrame。所有系列/列表的长度各不相同,但我想要接受此列表的前5个元素并将它们设置为自己的列。

首先,我尝试使用系列/列表的一部分设置一个新列(例如df.full_column.tolist()[:5]),但是我收到一个错误:

ValueError: Length of values does not match length of index

所以我基本上有两个问题:

  1. 首先从原始列中获取最多5个列表。为了进一步说明,如果列表中只有4个,那么我想要全部4个。
  2. 获取此列表并从所有列中创建列。类似于value_0,value_1,value_2,value_3,value_4,如果列表没有第4个或第5个,它将设置为NaN

谢谢!

python pandas
2个回答
2
投票

你可以使用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默认加入索引。

1
投票

让我们使用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
© www.soinside.com 2019 - 2024. All rights reserved.