我有一个数据框,其中第一列包含一个随机大小的列表,每个列表的范围从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...
答案 0 :(得分:1)
这就是我要做的。首先,我要填充原始列的列表,以使它们的长度相同,并且使用起来更容易。然后,只需创建列并用与列表中位置相对应的值填充列即可。假设我们的列表的大小最大为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))