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

时间:2017-01-26 11:11:15

标签: python pandas dataframe

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

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

hours = pd.Series([0,10,15,20,30])
mins = pd.Series([10,0,0,20,10])

我想做的是以下内容:

  • 返回包含总持续时间(以分钟为单位)的单个系列(即将小时数转换为分钟数,然后加上分钟值)
  • 如果小时值为15,30,45,60或90,则直接将其添加到分钟值而不进行小时分钟转换,然后将小时数设置为0.否则,将小时数转换为分钟数,然后执行添加

我期待输出为以下系列(注意索引2和4):

0      10.0
1     600.0
2      15.0
3    1220.0
4      40.0

我编写了以下功能,实现了我的目标:

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中执行此操作的正确方法是什么?我似乎无法弄清楚当涉及一个条件时如何在2列中使用pandas掩蔽

1 个答案:

答案 0 :(得分:2)

您可以将whereisin一起使用,只执行值不在您想要的值列表中的转换,然后您可以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