我是python的新手,正在学习使用数据框和列表推导。 我有以下数据框:
df1=pd.DataFrame({'names':[[['Hans Peter'],['Harry Potter']],[['bla bla'],['some string']]]})
现在我想将每个子列表分成单词。 对于一个列表我可以使用
x=[['Hans Peter'],['Harry Potter'],['bla bla'],['some string here']]
res=[]
for list in x:
res.append(str(list[0]).split())
但是我如何在数据帧上迭代呢?我认为我必须建立一个列表理解,然后使用apply()
方法来克服.append
吗?但是我不知道该怎么做。
我将为这样的单个列表构建列表理解:
res = [str(list[0]).split for list in x]
但是我得到包含此功能的列表:
[<function str.split(sep=None, maxsplit=-1)>,...]
DataFrame的预期输出为
0 [['Hans','Peter],['Harry','Potter']]
1 [['bla','bla'],['some','string']]
答案 0 :(得分:4)
首先,您需要调用spit
函数,因为否则str.split
是一个对象:
''.split
<built-in method split of str object at 0x1005a3ab0>
''.split() # call with parentheses
[]
第二,您需要进入names
中的子列表。您可以先使用for循环对此进行仿真:
for x in df1.names:
for a in x:
print(a)
['Hans Peter']
['Harry Potter']
['bla bla']
['some string']
列表将保持不变,因此您可以使用a.pop()
取出字符串,然后对str.split()
的结果使用pop()
:
df1.names = [[a.pop().split() for a in x] for x in df1.names]
df1
names
0 [[Hans, Peter], [Harry, Potter]]
1 [[bla, bla], [some, string]]
答案 1 :(得分:0)
您可以定义一个函数,该函数将列表列表中的单词分开,然后在“名称”系列中依次apply
:
In [211]: df1=pd.DataFrame({'names':[[['Hans Peter'],['Harry Potter']],[['bla bla'],['some string']]]})
In [212]: df1
Out[212]:
names
0 [[Hans Peter], [Harry Potter]]
1 [[bla bla], [some string]]
In [236]: def extractor(x):
...: l = []
...: for i in x:
...: for j in i:
...: l.append(j.split(' '))
...: return l
...: df1.names.apply(extractor)
Out[236]:
0 [[Hans, Peter], [Harry, Potter]]
1 [[bla, bla], [some, string]]
Name: names, dtype: object