如何将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)

【讨论】:

哇。很简单。谢谢!在这方面,一种方法比另一种更好吗? 这两种方法具有可比性,应该没有明显的效率差异。有一种思路认为pandasmethod chaining 通过df.pipe 等工具是前进的方向。在一般情况下我还不相信,但在某些情况下它可能更具可读性。

以上是关于如何将UDF应用于数据框?的主要内容,如果未能解决你的问题,请参考以下文章

将 UDF 动态应用于数据框中 N 列中的 1 到 N 列

将udf应用于多列并使用numpy操作

将 UDF 应用于 Spark Dataframe 中的多个列

Pyspark:UDF 将正则表达式应用于数据帧中的每一行

Pyspark:如何仅在具有 NotNull 值的行上应用 UDF

pyspark 中的 UDF 能否返回与列不同的对象?