【问题标题】:pandas error in df.apply() only for a specific dataframedf.apply() 中的熊猫错误仅适用于特定数据帧
【发布时间】:2020-11-23 05:22:04
【问题描述】:

在熊猫身上发现了一些非常奇怪的东西。我的数据框(3 行 3 列)如下所示:

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

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 工作得很好,我得到这样的新列:

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

附注get_first_last 是一个非常简单的函数,如下所示:

def get_first_last(s):
    str_lis = s.split("_")
    return [str_lis[0], str_lis[1]]

【问题讨论】:

  • 你需要result_type='expand'。而且你也不需要在这里使用apply,你可以简单地使用df['ID_Name'].str.split('_', expand=True)
  • 请在问题中包含输入 as text,以便其他人可以复制它。

标签: python pandas data-science data-cleaning


【解决方案1】:

来自pandas.DataFrame.apply 的文档:

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

所以问题是你的数据框的原始形状是 (3, 3) 并且你的应用函数的结果是 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')

希望这会有所帮助!

【讨论】:

  • 啊..“原始形状”!这是我错过的关键词。谢谢..有时我们确实需要第二双眼睛。 :) 顺便说一句,“扩展”也是一个有趣的。
【解决方案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

现在n=1 以防万一您有多个_(例如,作为名称的一部分) - 确保您最多返回 2 列(否则上述代码将失败)

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

    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

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2018-03-03
    • 2018-04-28
    • 2012-06-25
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多