将pandas对象展平到列

2024-06-16 17:48:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从一个数据帧展平一个列表。我现有的数据帧如下所示:

CreationDate
2013-12-22 15:25:02                    <ubuntu><mac-osx><syslinux>
2009-12-14 14:29:32    <ubuntu><mod-rewrite><laconica><apache-2.2>
2013-12-22 15:42:00                 <ubuntu><nat><squid><mikrotik>
Name: Tags, dtype: object

然后,我清理Tags列中的标记字符串:

^{pr2}$

结果是:

CreationDate
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]        3
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]        4
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]        4

现在,我为每个标记创建新列:

tag_df = pd.DataFrame(index=df.index, data=df["Tags"])
max_cols = tag_df["Tags"].map(len).max()
for col in range(max_cols):
    tag_df[col] = pd.Series(index=tag_df.index)

这给了我这样一个结论:

CreationDate
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux] NaN NaN NaN NaN NaN
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2] NaN NaN NaN NaN NaN
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik] NaN NaN NaN NaN NaN

对于Tags列中的每个标记,我想在其相应的“index”列中插入标记。所以,最终结果应该是这样的:

CreationDate
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux] ubuntu     mac-osx syslinux        NaN NaN
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2] ubuntu mod-rewrite laconica apache-2.2 NaN
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik] ubuntu         nat    squid   mikrotik NaN

我尝试过pd.DataFrame.insert()和各种形式的创建新数据帧并将它们合并在一起,我似乎找不到合适的组合。如何将Tags列中的每个对象展平到它在同一行上的相应列?在


Tags: moddfindexubuntumacapachetagsnan
2条回答

在这种情况下,我将使用.str.extractall()方法:

In [57]: df
Out[57]:
         CreationDate                                         Tags
0 2013-12-22 15:25:02                  <ubuntu><mac-osx><syslinux>
1 2009-12-14 14:29:32  <ubuntu><mod-rewrite><laconica><apache-2.2>
2 2013-12-22 15:42:00               <ubuntu><nat><squid><mikrotik>

In [58]: x = df.pop('Tags').str.extractall(r'\<(.*?)\>').unstack()

In [59]: x.columns = x.columns.droplevel(0)

In [60]: df.join(x)
Out[60]:
         CreationDate       0            1         2           3
0 2013-12-22 15:25:02  ubuntu      mac-osx  syslinux        None
1 2009-12-14 14:29:32  ubuntu  mod-rewrite  laconica  apache-2.2
2 2013-12-22 15:42:00  ubuntu          nat     squid    mikrotik

更新:假设数据是序列,而不是数据帧:

^{pr2}$

获取长度并转换为列表的部分解决方案。在

df.Tags = df.Tags.str.strip('<>')
df.Tags = df.Tags.str.split('><')
df['NumTags'] = df.Tags.apply(lambda x: len(x))

工作液
只需注释掉这些注释并复制到剪贴板,然后再进行注释。然后运行代码。在

^{pr2}$

输出:

enter image description here

相关问题 更多 >