df.apply()中的熊猫错误仅适用于特定数据帧

时间:2020-08-03 05:59:08

标签: python pandas data-science data-cleaning

在大熊猫中发现了一些很奇怪的东西。我的数据框(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]]

2 个答案:

答案 0 :(得分:1)

来自pandas.DataFrame.apply的文档:

“广播”:结果将广播到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')

希望这会有所帮助!

答案 1 :(得分:0)

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

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

您的数据将输出(我仅从数据框中提取了前两列)

   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是为了防止您有多个_(例如,作为名称的一部分)-确保您最多返回两列(否则上面的代码将失败)

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

    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
相关问题