从数据框中包含的列表中将列动态添加到熊猫数据框中

时间:2020-02-12 14:31:27

标签: python pandas

我有一个数据框,其中第一列包含一个随机大小的列表,每个列表的范围从0到大约10个项目。此数据框还包含其他几列数据。

我想插入与最长列表的长度一样多的列,然后依次填充值,以使每一列在第一列的列表中都有一个项目。

我不确定执行此操作的好方法。

sample = [[[0,2,3,7,8,9],2,3,4,5],[[1,2],2,3,4,5],[[1,3,4,5,6,7,8,9,0],2,3,4,5]]
headers = ["col1","col2","col3","col4","col5"]
df = pd.DataFrame(sample, columns = headers)

在此示例中,我想在第1列之后添加9列,因为这是数据帧第三行中列表的最大长度。这些列将填充:

 0 2  3    7    8     9  NULL NULL NULL in the first row,
 1 2 NULL NULL NULL NULL NULL NULL NULL in the second, etc... 

2 个答案:

答案 0 :(得分:1)

编辑以适合OP编辑

这就是我要做的。首先,我要填充原始列的列表,以使它们的长度相同,并且使用起来更容易。然后,只需创建列并用与列表中位置相对应的值填充列即可。假设我们的列表的大小最大为4,例如:

df = pd.DataFrame(sample, columns = headers)
df = df.rename(columns={'col1':'col_of_lists'})
max_length = max(df['col_of_lists'].apply(lambda x:len(x)))
df['col_of_lists'] = df['col_of_lists'].apply(lambda x:x + ([np.nan] * (max_length - len(x))))
for i in range(max_length):
    df['col_'+str(i)] = df['col_of_lists'].apply(lambda x: x[i])

答案 1 :(得分:0)

将一系列列表转换为单独列的最简单方法是使用apply将它们转换为Series,这将触发'expand'结果类型:

result = df['col1'].apply(pd.Series)

这时,我们可以调整自动编号的列,以包括原始'col1'的名称,例如:

result.columns = [
    'col1_{}'.format(i + 1)
    for i in result.columns]

最后,我们可以将其重新连接到原始DataFrame。利用这是第一列这一事实,可以很容易地将其连接到原始框架的左侧,并在此过程中放下原始'col1'

result = result.join(df.drop('col1', axis=1))

您甚至可以通过使用rename()方法来更改列名称,从而一站式完成所有操作:

df['col1'].apply(pd.Series).rename(
    lambda i: 'col1_{}'.format(i + 1),
    axis=1,
).join(df.drop('col1', axis=1))