【问题标题】:Python - apply function in stead of iterrows does not workPython - 应用函数而不是 iterrows 不起作用
【发布时间】:2021-08-31 08:32:35
【问题描述】:

我刚开始使用 python。 下面的代码有效,但我认为它不符合编码标准:

  1. 我在函数determine_direction 中遇到错误
  2. 我看到的每一个地方,聪明人都说你应该避免错误并改用 apply 函数。

有人可以帮我吗?

import pandas as pd

def determine_direction(df, fl_wr):
    # look up wind direction based on degrees
    # input: degrees - float
    # output: wind direction - string
    df_vlaremwindsel = df[(df['from'] <= fl_wr)]
    df_vlaremwindsel = df_vlaremwindsel[(fl_wr < df['to'])]
    str_direction = df_vlaremwindsel.index[0]
    return str_direction

# dataframe 1
lst_1 = {'NO': [22.5, 67.5], 'O': [67.5, 112.5], 'ZO': [112.5, 157.5], 'Z': [157.5, 202.5],
                   'ZW': [202.5, 257.5], 'W': [257.5, 292.5], 'NW': [292.5, 337.5], 'NNW': [337.5, 360.5],
                   'NNO': [0.5, 22.5], 'N': [0, 0.5]}
df_1= pd.DataFrame.from_dict(data=lst_1, orient='index', columns=['from', 'to'])

# dataframe 2 - testdata with degrees
lst_2 = [25.0, 88.1, 11, 356, 278, 169, 69, 1, 246]
df_2= pd.DataFrame.from_dict(data=lst_2)
# add empty column
df_2['direction']=''

#works, but i want to use .apply function
for i in range(len(df_2)):
    df_2.loc[i,['direction']] = determine_direction(df_1, df_2.iloc[i, 0])

print(df_2)
# apply function: does not work
# df_2['direction'].apply(determine_direction(df_1, df_2.loc['0']))

【问题讨论】:

    标签: python pandas apply


    【解决方案1】:

    df_2 运行代码的结果:

           0 direction
    0   25.0        NO
    1   88.1         O
    2   11.0       NNO
    3  356.0       NNW
    4  278.0         W
    5  169.0         Z
    6   69.0         O
    7    1.0       NNO
    8  246.0        ZW
    

    这与使用apply 无关。任务是确定您的值属于哪个区间,您可以为此使用pd.cut 并提供区间来简化:

    df_1 = df_1.sort_values('from')
    bins = np.unique(df_1.values)
    labels = df_1.index
    df_2= pd.DataFrame.from_dict(data=lst_2)
    df_2['direction'] = pd.cut(df_2[0],bins = bins,labels = labels)
    
           0 direction
    0   25.0        NO
    1   88.1         O
    2   11.0       NNO
    3  356.0       NNW
    4  278.0         W
    5  169.0         Z
    6   69.0         O
    7    1.0       NNO
    8  246.0        ZW
    

    【讨论】:

    • 谢谢!这要短得多,而且看起来很简单,但我永远不会想出那个解决方案。它在我的 ca 数据集上也非常快。 1000000 条记录。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多