【问题标题】:Python / pandas - convert conditional hours to minutesPython / pandas - 将条件小时转换为分钟
【发布时间】:2017-06-11 20:25:04
【问题描述】:

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

我有 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 掩码

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2018-12-26
      • 2013-07-30
      相关资源
      最近更新 更多