Python:分解数据框(列中每个条目一行,而不是列中的多个条目)
Python: break up dataframe (one row per entry in column, instead of multiple entries in column)
我有一个问题的解决方案,但令我失望的是它有点慢,我正在寻求有关如何加快我的解决方案的建议(通过添加矢量化或其他巧妙的方法)。我有一个看起来像这样的数据框:
toy = pd.DataFrame([[1,'cv','c,d,e'],[2,'search','a,b,c,d,e'],[3,'cv','d']],
columns=['id','ch','kw'])
输出为:
任务是将 kw
列分解为一个(复制的)行,每个字符串中的每个逗号分隔条目。因此,我希望实现的是:
我的初步解决方案如下:
data = pd.DataFrame()
for x in toy.itertuples():
id = x.id; ch = x.ch; keys = x.kw.split(",")
data = data.append([[id, ch, x] for x in keys], ignore_index=True)
data.columns = ['id','ch','kw']
问题是:对于较大的数据帧来说速度很慢。我希望有人以前遇到过类似的问题,并且知道如何优化我的解决方案。如果这很重要,我正在使用 python 3.4.x 和 pandas 0.19+。
谢谢!
您可以将 str.split
for list
s, then get len
用于 length
。
上次创建新 DataFrame
由 constructor
和 numpy.repeat
and numpy.concatenate
:
cols = toy.columns
splitted = toy['kw'].str.split(',')
l = splitted.str.len()
toy = pd.DataFrame({'id':np.repeat(toy['id'], l),
'ch':np.repeat(toy['ch'], l),
'kw':np.concatenate(splitted)})
toy = toy.reindex_axis(cols, axis=1)
print (toy)
id ch kw
0 1 cv c
0 1 cv d
0 1 cv e
1 2 search a
1 2 search b
1 2 search c
1 2 search d
1 2 search e
2 3 cv d
我有一个问题的解决方案,但令我失望的是它有点慢,我正在寻求有关如何加快我的解决方案的建议(通过添加矢量化或其他巧妙的方法)。我有一个看起来像这样的数据框:
toy = pd.DataFrame([[1,'cv','c,d,e'],[2,'search','a,b,c,d,e'],[3,'cv','d']],
columns=['id','ch','kw'])
输出为:
任务是将 kw
列分解为一个(复制的)行,每个字符串中的每个逗号分隔条目。因此,我希望实现的是:
我的初步解决方案如下:
data = pd.DataFrame()
for x in toy.itertuples():
id = x.id; ch = x.ch; keys = x.kw.split(",")
data = data.append([[id, ch, x] for x in keys], ignore_index=True)
data.columns = ['id','ch','kw']
问题是:对于较大的数据帧来说速度很慢。我希望有人以前遇到过类似的问题,并且知道如何优化我的解决方案。如果这很重要,我正在使用 python 3.4.x 和 pandas 0.19+。
谢谢!
您可以将 str.split
for list
s, then get len
用于 length
。
上次创建新 DataFrame
由 constructor
和 numpy.repeat
and numpy.concatenate
:
cols = toy.columns
splitted = toy['kw'].str.split(',')
l = splitted.str.len()
toy = pd.DataFrame({'id':np.repeat(toy['id'], l),
'ch':np.repeat(toy['ch'], l),
'kw':np.concatenate(splitted)})
toy = toy.reindex_axis(cols, axis=1)
print (toy)
id ch kw
0 1 cv c
0 1 cv d
0 1 cv e
1 2 search a
1 2 search b
1 2 search c
1 2 search d
1 2 search e
2 3 cv d