python - 将 Pandas 对象展平到列

标签 python pandas dataframe

我正在尝试展平来自 DataFrame 的列表。我现有的 DataFrame 如下所示:

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 列中的标记字符串:

def tag_cleaner(s):
    s0 = "".join(s.split("<")).split(">")
    return [i for i in s0 if i != ""]

df["Tags"] = df["Tags"].apply(lambda t: tag_cleaner(t))
df["NumTags"] = df["Tags"].apply(lambda x: len(x))

结果是:

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 列中的每个标记,我想在其适当的“索引”列中插入标记。所以,最终结果应该是这样的:

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() 和创建新 DataFrame 并将它们合并在一起的各种形式,我似乎无法找到正确的组合。如何将 Tags 列中的每个对象展平到同一行的适当列?

最佳答案

我会使用 .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

更新:假设数据是一个 Series,而不是 DataFrame:

In [14]: s
Out[14]:
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

In [15]: type(s)
Out[15]: pandas.core.series.Series

In [16]: x = s.str.extractall(r'\<(.*?)\>').unstack().rename_axis(None)

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

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

关于python - 将 Pandas 对象展平到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41339388/

相关文章:

r - 在 R : Vary 1 parameter (column), 中编程敏感性分析保持其他不变。更好的方法?

python - 根据不同文件夹中的名称重命名文件夹中的文件

python - 为 python 2.7 安装 scipy

python - 如何在 Python 的特定范围内替换数据框中的数字?

python - 从数据框列中选择非无值

python - 无法使用 Pandas 在 Python 中将 0 替换为 nan

python - Pandas 过滤并转换为日期到 datetime64ns

python - Pandas:使用 groupby 来计算日期之间的差异

Python:ConfigParser.NoSectionError:没有部分: 'TestInformation'

python - 使用 groupby 对象编辑数据框条目 --pandas