【问题标题】:iterate for loop over dataframe rows [duplicate]在数据帧行上迭代for循环[重复]
【发布时间】:2019-11-10 14:54:12
【问题描述】:

我是 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']]

【问题讨论】:

  • 你的预期输出是什么?
  • 刚刚更新 ;)
  • 在您的列表理解中,您犯了两个常见错误:您使用的是 .split 而不是 .split()(这就是它返回函数而不是结果的原因),并且您重新使用list 作为变量,这会影响内置的list 类型并导致问题

标签: python pandas list


【解决方案1】:

首先,你需要调用split函数,否则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() 取出字符串,然后在 pop() 的结果上使用 str.split()

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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多