在大熊猫中发现了一些很奇怪的东西。我的数据框(3行3列)如下所示:
当我尝试使用下面的命令将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可以很好地工作,并且我得到如下新列:
我检查了很多SO答案,但似乎没有帮助。我在这里想念什么?
P.S。 get_first_last是一个非常简单的函数,如下所示:
def get_first_last(s):
str_lis = s.split("_")
return [str_lis[0], str_lis[1]]
答案 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