我有一些工作代码可以将小时数转换为分钟数(以小时值为条件)但我正在迭代数据帧行,这对于较大的数据帧似乎不是很有效
我有2个大熊猫系列(实际上这些是更大数据帧的列):
hours = pd.Series([0,10,15,20,30])
mins = pd.Series([10,0,0,20,10])
我想做的是以下内容:
我期待输出为以下系列(注意索引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掩蔽
答案 0 :(得分:2)
您可以将where
与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