Python/pandas-将条件小时转换为分钟

Python/pandas-将条件小时转换为分钟,python,pandas,dataframe,Python,Pandas,Dataframe,我有一些将小时转换为分钟的工作代码(以小时值为条件),但我目前正在迭代数据帧行,对于较大的数据帧,这似乎不是很有效 我有2个熊猫系列(实际上,这些是一个更大数据帧的列): 我想做的是: 返回包含总持续时间(以分钟为单位)的单个序列(即,将小时转换为分钟,然后添加到分钟值) 如果小时值为15、30、45、60或90,则直接将其添加到分钟值,而不进行小时-分钟转换,然后将小时设置为0。否则,将小时转换为分钟,然后进行加法 我希望输出为以下系列(注意索引2和4): 我编写了以下函数,实现了我想要的

我有一些将小时转换为分钟的工作代码(以小时值为条件),但我目前正在迭代数据帧行,对于较大的数据帧,这似乎不是很有效

我有2个熊猫系列(实际上,这些是一个更大数据帧的列):

我想做的是:

  • 返回包含总持续时间(以分钟为单位)的单个序列(即,将小时转换为分钟,然后添加到分钟值)
  • 如果小时值为15、30、45、60或90,则直接将其添加到分钟值,而不进行小时-分钟转换,然后将小时设置为0。否则,将小时转换为分钟,然后进行加法
我希望输出为以下系列(注意索引2和4):

我编写了以下函数,实现了我想要的功能:

def convert_time(hours, minutes):
    df_duration = pd.DataFrame({"hours": hours, "minutes": minutes}).astype(float)
    series_converted = pd.Series()

    # Replace nan with zero
    df_duration = df_duration.fillna(0)

    # Convert out of bound hour values, add to minutes
    for i in range(df_duration.shape[0]):
        if df_duration.iloc[i]["hours"] in (15,30,45,60,90):
            cur_hours = 0
            cur_mins = df_duration.iloc[i]["hours"] + df_duration.iloc[i]["minutes"]
        else:
            cur_hours = df_duration.iloc[i]["hours"]
            cur_mins = df_duration.iloc[i]["minutes"]

        series_converted.set_value(i,(cur_hours * 60) + cur_mins)

    return series_converted

在Pandas中,不迭代数据帧行的正确方法是什么?我似乎不知道如何在涉及条件时跨两列使用pandas掩蔽

您可以使用
where
with
isin
仅在值不在所需值列表中的情况下执行转换,然后您可以使用正常操作
fillna

In [134]:
(hours.where(~hours.isin([15,30,45,60,90])) * 60 + mins).fillna(hours + mins)

Out[134]:
0      10.0
1     600.0
2      15.0
3    1220.0
4      40.0
dtype: float64
您可以看到这种情况:

In [135]:   
hours.isin([15,30,45,60,90])

Out[135]:
0    False
1    False
2     True
3    False
4     True
dtype: bool

In [136]:
~hours.isin([15,30,45,60,90])

Out[136]:
0     True
1     True
2    False
3     True
4    False
dtype: bool

In [138]:
hours.where(~hours.isin([15,30,45,60,90]))

Out[138]:
0     0.0
1    10.0
2     NaN
3    20.0
4     NaN
dtype: float64

In [139]:
(hours.where(~hours.isin([15,30,45,60,90])) * 60 + mins)

Out[139]:
0      10.0
1     600.0
2       NaN
3    1220.0
4       NaN
dtype: float64
In [134]:
(hours.where(~hours.isin([15,30,45,60,90])) * 60 + mins).fillna(hours + mins)

Out[134]:
0      10.0
1     600.0
2      15.0
3    1220.0
4      40.0
dtype: float64
In [135]:   
hours.isin([15,30,45,60,90])

Out[135]:
0    False
1    False
2     True
3    False
4     True
dtype: bool

In [136]:
~hours.isin([15,30,45,60,90])

Out[136]:
0     True
1     True
2    False
3     True
4    False
dtype: bool

In [138]:
hours.where(~hours.isin([15,30,45,60,90]))

Out[138]:
0     0.0
1    10.0
2     NaN
3    20.0
4     NaN
dtype: float64

In [139]:
(hours.where(~hours.isin([15,30,45,60,90])) * 60 + mins)

Out[139]:
0      10.0
1     600.0
2       NaN
3    1220.0
4       NaN
dtype: float64