df.apply() 中的 pandas 错误仅适用于特定 DataFrame

pandas error in df.apply() only for a specific dataframe

提问人:knightcool 提问时间:8/3/2020 更新时间:8/3/2020 访问量:752

问:

在熊猫身上注意到了一些非常奇怪的东西。我的数据帧(有 3 行和 3 列)如下所示:

enter image description here

当我尝试使用以下命令将 ID 和 Name(用下划线分隔)提取到它们自己的列时,它给了我一个错误:

df[['ID','Name']] = df.apply(lambda x: get_first_last(x['ID_Name']), axis=1, result_type='broadcast')

错误是:

ValueError: cannot broadcast result

不过,这是有趣的部分..当我从原始数据帧中删除“From_To”列时,执行相同的 df.apply() 来拆分ID_Name效果很好,我得到了这样的新列:enter image description here

我检查了很多 SO 答案,但似乎都没有帮助。我在这里错过了什么?

P.S. get_first_last 是一个非常简单的函数,如下所示:

def get_first_last(s):
    str_lis = s.split("_")
    return [str_lis[0], str_lis[1]]
Python Pandas 科学 数据清理

评论

1赞 Shubham Sharma 8/3/2020
你需要。而且你不需要在这里使用,你可以简单地使用.result_type='expand'applydf['ID_Name'].str.split('_', expand=True)
0赞 Roy2012 8/3/2020
请将输入作为文本包含在问题中,以便其他人可以复制它。

答:

2赞 elouassif 8/3/2020 #1

来自熊猫的文档。DataFrame.应用

'broadcast' : 结果将广播到 DataFrame 的原始形状,原始索引和列将被保留。

所以问题是你的数据帧的原始形状是 (3, 3),而你的 apply 函数的结果是 2 列,所以你有一个不匹配。这也解释了为什么当你删除“From_To”时,新形状是(3,2),现在你有一个匹配项......

您可以使用“广播”而不是“扩展”,您将获得预期的结果。

  table = [
      ['1_john', 23, 'LoNDon_paris'],
      ['2_bob', 34, 'Madrid_milan'],
      ['3_abdellah', 26, 'Paris_Stockhom']
  ]
  df = pd.DataFrame(table, columns=['ID_Name', 'Score', 'From_to'])
  df[['ID','Name']] = df.apply(lambda x: get_first_last(x['ID_Name']), axis=1, result_type='expand')

希望这有帮助!

评论

0赞 knightcool 8/4/2020
啊......”原始形状“!这就是我错过的关键词。谢谢。。有时我们确实需要第二双眼睛。:)顺便说一句,“扩展”也是一个有趣的。
0赞 Grzegorz Skibinski 8/3/2020 #2

这绝对不是一个好的用例,你应该这样做:apply

df[["ID", "Name"]]=df["ID_Name"].str.split("_", expand=True, n=1)

您的数据将输出哪个(我只从您的数据框中获取了前 2 列):

   ID_Name  Score ID   Name
0   1_john     23  1   john
1    2_bob     34  2    bob
2  3_janet     45  3  janet

现在只是为了以防万一你会有多个(例如作为名称的一部分) - 以确保你最多返回 2 列(否则上面的代码会失败)n=1_

例如,如果我们稍微修改您的代码,我们会得到以下输出:

    ID_Name  Score ID    Name
0    1_john     23  1    john
1  2_bob_jr     34  2  bob_jr
2   3_janet     45  3   janet