从数据帧中选择特定的行,并为新列执行计算



我有一个数据帧,看起来像这样。

Task[ms]                              Funktion  ...     min     max
0        1              CALL_TK_CDDio_PFC_BEGIN_1MS  ...   0.640000   3.360000
1        1                       vAdcD_MainFunction  ...  21.280001  25.920000
2        1                          vPressE_Main1ms  ...  17.120001  81.279999
3        1  vPositionSensorPwm_MainFunction_Fast_In  ...   9.920000  13.760000
4        1                           CDDIO_1MS_1_IN  ...   2.240000   5.280000

我必须选择与该列名称相对应的行。有146行df['Messvariable']。这是数据帧的Messvariable列

0      timeslices[0].profilerDataProcess[0]_C0[us]
1      timeslices[0].profilerDataProcess[1]_C0[us]
2      timeslices[0].profilerDataProcess[2]_C0[us]
3      timeslices[0].profilerDataProcess[3]_C0[us]
4      timeslices[0].profilerDataProcess[4]_C0[us]

141    timeslices[9].profilerDataProcess[0]_C0[us]
142    timeslices[9].profilerDataProcess[1]_C0[us]
143    timeslices[9].profilerDataProcess[2]_C0[us]
144    timeslices[9].profilerDataProcess[3]_C0[us]
145    timeslices[9].profilerDataTask_C0[us]

我想通过这一列选择特定的行,并执行类似于的操作

while  df['Messvariable'].str.contains("timeslices[1]"):
df['CPU_LOAD']=df['max']/(10000*2)

并且类似地对于具有不同计算的所有剩余时隙。它不起作用。

str.contains返回空数据帧

还有其他方法吗?

主要问题是regex=True默认参数(pat使用正则表达式(。只需将参数设置为False,也可以使用startswith()find():

df = pd.DataFrame.from_dict({
'Messvariable': ('timeslices[1]', 'timeslices[1]', 'empty', 'empty'),
'max': (1, 2, 3, 4),
})
mask = df['Messvariable'].str.contains('timeslices[1]', regex=False)
# or
# mask = df['Messvariable'].str.find('timeslices[1]') != -1
# or
# mask = df['Messvariable'].str.startswith('timeslices[1]')
df['CPU_LOAD'] = 0
df.loc[mask, 'CPU_LOAD'] = df[mask]['max'] / (10000 * 2)
print(df.head())
#    Messvariable  max  CPU_LOAD
# 0  timeslices[1]    1   0.00005
# 1  timeslices[1]    2   0.00010
# 2          empty    3   0.00000
# 3          empty    4   0.00000

已更新对于不同的计算,最好使用带有自定义功能的apply

df['CPU_LOAD'] = 0
def set_cpu_load(x):
if x['Messvariable'].startswith('timeslices[1]'):
x['CPU_LOAD'] = x['max'] / (10000 * 2)
elif x['Messvariable'].startswith('timeslices[2]'):
pass  # other calculation
# elif ...
return x
df = df.apply(set_cpu_load, axis=1)

最新更新