如何根据列条目根据特定条件更改熊猫列数据?

时间:2020-07-13 16:43:26

标签: python pandas function lambda

我有一个像这样的数据框:

    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,但是,我似乎无法以所需的方式更改数据。 预先感谢!

2 个答案:

答案 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')