我正在尝试展平来自 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/