中遍历一个数据帧,并以此摆脱完整的安装路径。因此,只应说明应用程序名称,例如 Firefox.exe 或 Firefox,而不是"C:\Program Files\Mozilla Firefox\firefox.exe"。
我创建了一个函数,该函数将相应的数据帧和一个包含键值对的 dcitonary,其中应用程序名称作为键(火狐(,通配符路径作为值(*firefox.exe(。
def transform_process_name(mid_result_df, name_dict):
for row, col in mid_result_df.iterrows():
for name, value in name_dict.items():
print(name)
print(value)
if col['ProcessName'] == value:
col['ProcessName'] = name
return mid_result_df
这在函数中调用,如下所示:
transform_process_name(mid_result_df, __name_of_processes)
哪里
__name_of_processes =
{
'firefox': '*firefox.exe',
}
所以输出仍然是"C:\Program Files\Mozilla Firefox\firefox.exe"而不是"firefox"。
谢谢:)
编辑:它现在适用于
def transform_process_name(mid_result_df, name_dict):
for row, col in mid_result_df.iterrows():
for name, value in name_dict.items():
string_check = col['ProcessName']
if string_check.endswith(value):
mid_result_df.at[row, 'ProcessName'] = name
return mid_result_df
我认为你不能用==
来比较"C:\Program Files\Mozilla Firefox\firefox.exe"和"*firefox.exe"。我想你可能想替换
if col['ProcessName'] == value:
跟
if value in col['ProcessName']:
或
if col['ProcessName'].endswith(value):
value
应该是"火狐.exe"。
编辑:
这是我的代码:
import pandas as pd
def transform_process_name(mid_result_df, name_dict):
for row, col in mid_result_df.iterrows():
for name, value in name_dict.items():
if value in col['ProcessName']:
# if col['ProcessName'].endswith(value):
col['ProcessName'] = name
else:
col['ProcessName'] = col['ProcessName']
return mid_result_df
mid_result_df = pd.DataFrame({'ProcessName': ['C:\Program Files\Mozilla Firefox\firefox.exe']})
name_dict = {'firefox': 'firefox.exe'}
result = transform_process_name(mid_result_df, name_dict)
print(result)
也许我不太理解这个问题,但是如果您有一个包含每个应用程序路径的数据帧,为什么不使用 os
模块中的本机函数来提取应用程序本身的名称?
例如:
import pandas as pd
import os
def get_application(path):
return os.path.splitext(os.path.basename(path))[0]
path = "C:/Program Files/Mozilla Firefox/"
df = pd.DataFrame([os.path.join(path + "firefox.exe"), os.path.join(path + "myapp.exe")],
columns=["full_path"])
df["application"] = df["full_path"].apply(get_application)
print(df)
在这里,我创建了一个包含应用程序路径的虚拟数据帧。然后我定义一个函数,该函数给定一个路径,只返回应用程序名称(basename
(而不返回点(splitext
(。
apply 方法将函数应用于数据帧的每个元素,输出存储在新列中。
结果:
full_path application
0 C:/Program Files/Mozilla Firefox/firefox.exe firefox
1 C:/Program Files/Mozilla Firefox/myapp.exe myapp