Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于处理多个事件的另一列向数据帧添加一列_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于处理多个事件的另一列向数据帧添加一列

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°)

我有一个函数,它根据我调用的API提供日落和日出的时间,该API的日期为“%d/%m/%Y”格式的字符串

我有一个数据框,其列日期包含格式为“%d/%m/%Y”的字符串

我想在我的数据框中添加一列“日出”和“日落”,但不使用apply。如果我使用
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)