我有一个像这样的数据框:
MONTH TIME PATH RATE
0 Feb 15:24:11 enp1s0 14.71Kb
我想创建一个函数,该函数可以标识RATE列中的是“ Kb”还是“ Mb”。如果RATE列中的条目末尾有'Kb'或'Mb',则将其去除'Kb'/'Mb'并执行将其转换为b的操作。 到目前为止,这是我的代码,其中Dataframe将RATE视为对象:
df=pd.DataFrame(listOfLists)
def strip(bytesData):
if "Kb" in bytesData:
bytesData/1000
elif "Mb" in bytesData:
bytesData/1000000
df['RATE']=df.apply(lambda x: strip(x['byteData']), axis=1)
如何在删除不想要的字符并将其转换为所需格式的同时更改列中的值?我知道此操作完成后,必须将其更改为int,但是,我似乎无法以所需的方式更改数据。 预先感谢!
答案 0 :(得分:1)
我稍微修改了您的函数,并使用map(lambda x:)
而不是apply,因为我们正在处理系列而不是整个数据帧。另外,我还添加了一些其他行,以提供有关Kb和Mb的示例,如果两者都不存在:
example_df = pd.DataFrame({'Month':[0,1,2,3],
'Time':['15:32','16:42','17:11','15:21'],
'Path':['xxxxx','yyyyy','zzzzz','aaaaa'],
'Rate':['14.71Kb','18.21Mb','19.01Kb','Error_1']})
def case_1(value):
if value[-2:] == 'Kb':
return float(value[:-2])*1000
elif value[-2:] == 'Mb':
return float(value[:-2])*100000
else:
return np.nan
example_df['Rate'] = example_df['Rate'].map(lambda x: case_1(x))
该函数的逻辑是,如果以Kb
结尾,则将该值乘以1000;否则,如果以Mb
结尾,则将该值乘以100000,否则只需返回NaN(因为两者均不满足两个条件中的一个)
输出:
Month Time Path Rate
0 0 15:32 xxxxx 14710.0
1 1 16:42 yyyyy 1821000.0
2 2 17:11 zzzzz 19010.0
3 3 15:21 aaaaa NaN
答案 1 :(得分:1)
这是我可能如何处理的另一种选择。此解决方案可以处理其他缩写。不过,它确实依赖于正则表达式re
标准lib软件包。
此方法创建了一个名为Bytes
的新列。我经常发现在这种情况下保留RATE
列会很有用,以验证没有我没有想到的边缘情况。我还使用映射来获取必要的能力,以提高该值以获取正确的字节。我确实添加了删除原始RATE
列并重命名新列所需的代码。
import re
def convert_to_bytes(contents):
value, label, _ = re.split('([A-Za-z]+)', contents)
factors = {'Kb': 1, 'Mb': 2, 'Gb': 3, 'Tb': 4}
return float(value) * 1000**(factors[label])
df['Bytes'] = df['RATE'].map(convert_to_bytes)
# Drop original RATE column
df = df.drop('RATE', axis=1)
# Rename Bytes column to RATE
df = df.rename({'Bytes': 'RATE'}, axis='columns')