select 数据框中的特定行并为新列执行计算
select specific rows from dataframe and perform calculations for new column
我有一个看起来像这样的数据框。
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
我必须 select 行对应于此列名称。有 146 行 df['Messvariable'] 。这是 dataframe
的 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]
我想 select 此列的特定行并执行这样的操作
while df['Messvariable'].str.contains("timeslices[1]"):
df['CPU_LOAD']=df['max']/(10000*2)
对于所有剩余的具有不同计算的时间片也是如此。
没用。
str.contains Returns 空数据帧。
还有其他方法吗?
主要问题是 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)
我有一个看起来像这样的数据框。
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
我必须 select 行对应于此列名称。有 146 行 df['Messvariable'] 。这是 dataframe
的 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]
我想 select 此列的特定行并执行这样的操作
while df['Messvariable'].str.contains("timeslices[1]"):
df['CPU_LOAD']=df['max']/(10000*2)
对于所有剩余的具有不同计算的时间片也是如此。 没用。
str.contains Returns 空数据帧。
还有其他方法吗?
主要问题是 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)