Python 基于处理多个事件的另一列向数据帧添加一列
我有一个函数,它根据我调用的API提供日落和日出的时间,该API的日期为“%d/%m/%Y”格式的字符串 我有一个数据框,其列日期包含格式为“%d/%m/%Y”的字符串 我想在我的数据框中添加一列“日出”和“日落”,但不使用apply。如果我使用Python 基于处理多个事件的另一列向数据帧添加一列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个函数,它根据我调用的API提供日落和日出的时间,该API的日期为“%d/%m/%Y”格式的字符串 我有一个数据框,其列日期包含格式为“%d/%m/%Y”的字符串 我想在我的数据框中添加一列“日出”和“日落”,但不使用apply。如果我使用dataframe.Date.apply()它将在每一行上重复对于同一个日期,我有3000行,因此每个不同日期只调用一次get_sun会快得多 I包含以下表单的输出: Date Time Sky temp (C°)
dataframe.Date.apply()
它将在每一行上重复对于同一个日期,我有3000行,因此每个不同日期只调用一次get_sun
会快得多
I包含以下表单的输出:
Date Time Sky temp (C°) Ambient temp (C°) Sunrise Sunset
0 01/01/2020 00:00:07 -13.01 8.23 7:58:32 18:21:39
1 01/01/2020 00:01:12 -12.93 8.25 7:58:32 18:21:39
2 01/01/2020 00:02:17 -12.91 8.19 7:58:32 18:21:39
3 01/01/2020 00:03:22 -12.75 8.19 7:58:32 18:21:39
4 01/01/2020 00:04:27 -12.99 8.17 7:58:32 18:21:39
我的代码如下:
df['Sunrise'] = ""
df['Sunset'] = ""
for i in tqdm(unique(df.Date.values)):
(sunrise, sunset) = get_sun(i)
df[df.Date.apply(lambda x : x==i)]['Sunrise'].apply(lambda x : sunrise)
df[df.Date.apply(lambda x : x==i)]['Sunset']=sunset
df[df.Date.apply(lambda x:x==i)]
是我只选择日期等于i的数据帧行的方法。对于这些行,我想在相应的列中附加sunrise和sunset的值
提前谢谢你我想你把新专栏的定义搞得太复杂了。只需调用
pandas.apply
即可满足您的需要。无需手动迭代,也无需查找唯一的日期
以下是一个简化示例(日期/日出/日落为整数):
我认为你把新栏目的定义复杂化了。只需调用
pandas.apply
即可满足您的需要。无需手动迭代,也无需查找唯一的日期
以下是一个简化示例(日期/日出/日落为整数):
我找到了一个可能不是最干净的答案:
def fun(sub_df):
Date = df.Date.iloc[0]
(sunrise, sunset) = get_sun(Date)
sub_df['Sunrise'] = sunrise
sub_df['Sunset'] = sunset
return sub_df
df = df.groupby('Date').apply(fun)
它基于@Marc的答案,但不是对每行应用我的函数,而是对每个由日期分隔的子数据帧应用我的函数。我通过获取日期列的第一个值来获取日期:
df.date.iloc[0]
我找到了一个可能不是最干净的答案:
def fun(sub_df):
Date = df.Date.iloc[0]
(sunrise, sunset) = get_sun(Date)
sub_df['Sunrise'] = sunrise
sub_df['Sunset'] = sunset
return sub_df
df = df.groupby('Date').apply(fun)
它基于@Marc的答案,但不是对每行应用我的函数,而是对每个由日期分隔的子数据帧应用我的函数。我通过获取日期列的第一个值来获取日期:
df.date.iloc[0]
请指定一个最小的工作示例和预期的输出。不过有一点需要注意:我感觉你误解了pandas.DataFrame的原则。您不应该使用python for循环,而应该只使用pandas固有的函数。它们的实现方式是,它们会自动影响整个数据帧,即列或行。您可以查看以快速介绍。在您的案例中,分组数据帧df.groupby('Date')
可能会取代for循环。感谢您的回答,我考虑过使用groupby,但我不知道如何在使用此方法填充df的两列时最小化对我的API的调用次数。这是否回答了您的问题?请指定一个最小的工作示例和预期输出。不过有一点需要注意:我感觉你误解了pandas.DataFrame的原则。您不应该使用python for循环,而应该只使用pandas固有的函数。它们的实现方式是,它们会自动影响整个数据帧,即列或行。您可以查看以快速介绍。在您的案例中,分组数据帧df.groupby('Date')
可能会取代for循环。感谢您的回答,我考虑过使用groupby,但我不知道如何在使用此方法填充df的两列时最小化对我的API的调用次数。这是否回答了您的问题?谢谢你的回答,这是非常干净和适当的,但正如我所说的,我不希望使用这种方法,因为它会引发对每一行的get_sunrise调用。。。如我的示例所示,我每分钟有一行,因此每天大约有1500行。我的目标是每天调用一次并填充所有相应的行,我将调用我的API 300次而不是5K次。我不知道我的要求是否清楚,抱歉,谢谢你的回答,这是非常干净和合适的,但正如我所说的,我不希望使用这种方法,因为它会引发每行的get_sunrise呼叫。。。如我的示例所示,我每分钟有一行,因此每天大约有1500行。我的目标是每天调用一次并填充所有相应的行,我将调用我的API 300次而不是5K次。我不知道我的要求是否清楚对不起
def fun(sub_df):
Date = df.Date.iloc[0]
(sunrise, sunset) = get_sun(Date)
sub_df['Sunrise'] = sunrise
sub_df['Sunset'] = sunset
return sub_df
df = df.groupby('Date').apply(fun)