如何将UDF应用于数据框?
Posted
技术标签:
【中文标题】如何将UDF应用于数据框?【英文标题】:How to apply UDF to dataframe? 【发布时间】:2018-02-19 00:23:30 【问题描述】:我正在尝试创建一个函数,该函数将清理我通过该函数放置的数据框。但是我注意到返回的 df 被清理了,但没有代替原来的 df。
如何在数据帧上运行 UDF 并将更新的数据帧保存在适当的位置?
附言我知道我可以将这些规则合并到一行中,但是我正在创建的函数要复杂得多,所以我不想在这个示例中合并
df = pd.DataFrame('Key': ['3', '9', '9', '9', '9','34','34', '34'],
'LastFour': ['2290', '0087', 'M433','M433','25','25','25','25'],
'NUM': [20120528, 20120507, 20120615,20120629,20120621,20120305,20120506,20120506])
def cleaner(x):
x = x[x['Key'] == '9']
x = x[x['LastFour'] == 'M433']
x = x[x['NUM'] == 20120615]
return x
cleaner(df)
来自 UDF 的结果:
Key LastFour NUM
2 9 M433 20120615
但如果我在函数之后运行 df,那么我仍然会得到原始数据集:
Key LastFour NUM
0 3 2290 20120528
1 9 0087 20120507
2 9 M433 20120615
3 9 M433 20120629
4 9 25 20120621
5 34 25 20120305
6 34 25 20120506
7 34 25 20120506
【问题讨论】:
你不需要丑陋的函数。你可以使用df.query
,它的速度要快很多:df = df.query("Key == '9' and LastFour == 'M433' and NUM == 20120615")
【参考方案1】:
您需要将cleaner(df)
的结果分配回df
,如下所示:
df = cleaner(df)
另一种方法是使用pd.DataFrame.pipe
通过函数传递您的数据框:
df = df.pipe(cleaner)
【讨论】:
哇。很简单。谢谢!在这方面,一种方法比另一种更好吗? 这两种方法具有可比性,应该没有明显的效率差异。有一种思路认为pandas
method chaining 通过df.pipe
等工具是前进的方向。在一般情况下我还不相信,但在某些情况下它可能更具可读性。以上是关于如何将UDF应用于数据框?的主要内容,如果未能解决你的问题,请参考以下文章
将 UDF 应用于 Spark Dataframe 中的多个列