转换熊猫列的值

时间:2018-06-20 11:43:49

标签: python pandas

我的csv格式如下

Used CPU    Used Memory Hard CPU    Hard Memory
    1       4Gi         50          24Gi
    0       0           0           0
    2       4Gi         4           8Gi
    2       4Gi         4           8Gi
    0       0           100m        128Mi
    51550m  39528Mi     56          47Gi

它们是字符串值。在此表中,51550m表示我需要转换为核心的千毫。 39528Mi是兆字节,我需要将其转换为gibibyte(左右)。我想知道如何才能明智地读取每个值列,以及是否找到m (例如在51550m中),将其转换为岩心。然后将列的所有值转换为整数,以便我可以将它们全部添加。

我想使用熊猫,但我对此很陌生。我知道我可以尝试df["col_name"].astype("int")转换为整数,但是我还需要解释毫核心值以将其转换。

非常感谢您的帮助。

预期的输出:所有值都必须为浮点型。我从谈话中脱颖而出

100 millicore = 1/10 cores
1 Mebibyte = 0.00104858 GB


  Used CPU  Used Memory Hard CPU    Hard Memory
        1       4.296       50          25.7698 
        2       4.296       4           8.592
        2       4.296       4           8.592
        0       0           .1          0.134218 
        51.550  41.448112   56          50.4659

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作。

已更新:

df = pd.read_csv("your_csv_file")

'''df = pd.DataFrame({'Used CPU':['1','0','2','2','0','51550m'], \
                   'Used Memory':['4Gi','0','4Gi','4Gi','0', '39528Mi'], \
                   'Hard CPU':['50','0','4','4','100m','56'], \
                   'Hard Memory':['24Gi','0','8Gi', '8Gi', '128Mi', '47Gi']})'''

units = {'m':0.001,'Mi':0.00104858,'Gi':1.0737425}
def conversion(x):
    for key in units.keys():
        if key in str(x):
            x = x.split(key)[0]
            x = (int(x)*units[key])
            return x
    return str(x)

df = df.applymap(conversion)
df = df.apply(lambda x: x.astype(np.float64), axis=1)
print(df)

输入:

   Hard CPU  Hard Memory  Used CPU  Used Memory
0  50        24Gi         1         4Gi
1  0         0            0         0
2  4         8Gi          2         4Gi
3  4         8Gi          2         4Gi
4  100m      128Mi        0         0
5  56        47Gi         51550m    39528Mi

输出:

    Hard CPU  Hard Memory  Used CPU  Used Memory
0   50.0      25.76980     1.00      4.29497
1   0.0       0.000000     0.00      0.00000
2   4.0       8.589940     2.00      4.29497
3   4.0       8.589940     2.00      4.29497
4   0.1       0.134218     0.00      0.00000
5   56.0      50.465898    51.55     41.44827

它们在Float64中。现在您可以使用df['Hard Memory'] + df['Used Memory']

答案 1 :(得分:1)

我没有找到任何简单的方法,这是一种肮脏的方法 基本上,您的列包含不同的字符串(Gi和Mi),并且需要单独计算。因此,您可以执行以下操作。另外,我在这里没有计算Hard CPU列,但是想法是相同的,并且基本上可以为它使用相同的模式(如Used CPU列)。

df['Used CPU'] = np.where(df['Used CPU'].str.contains('m'),
                          pd.to_numeric(df['Used CPU'].map(lambda x:str(x)[:-1])) /1000,
                          df['Used CPU'])

df['Used Memory'] = np.where(df['Used Memory'].str.contains('Mi'),
                          pd.to_numeric(df['Used Memory'].map(lambda x:str(x)[:-2])) * 0.00104858,
                          df['Used Memory'])

df['Hard Memory'] = np.where(df['Hard Memory'].str.contains('Gi'),
                          pd.to_numeric(df['Hard Memory'].map(lambda x:str(x)[:-2])) *(use math conversion here),
                          df['Hard Memory'])

现在,对于第二列,也有Gi值,因此您可以像这样重复相同的操作

df['Used Memory'] = np.where(df['Used Memory'].str.contains('Gi'),
                          pd.to_numeric(df['Used Memory'].map(lambda x:str(x)[:-2])) * (do math conversion here),
                          df['Used Memory'])

因为一列中的每个项目都需要不同的数学转换(如果存在这样的字符串)。我能想到的简单可行的解决方案就是这样。抱歉

答案 2 :(得分:1)

在熊猫中创建自定义功能非常容易。 也许您可以尝试以下方法:

# import
import pandas as pd
# reading file
df = pd.read_csv("PATH_TO_CSV_FILE")

def func_CPU(x):
    """ function for CPU related columns"""
    if x[-1] == "m":
        return float(x[:-1])/1000
    else: return x

def func_Memory(x):
    """ function for Memory related columns"""
    if x[-2:] == "Gi":
        return float(x[:-2]) * 1024 *0.00104858
    elif x[-2:] == "Mi":
        return float(x[:-2]) * 0.00104858
    else: return x



df["Used_CPU"] = df["Used_CPU"].apply(func_CPU)
df["Used_Memory"] = df["Used_Memory"].apply(func_Memory)
df["Hard_CPU"] = df["Hard_CPU"].apply(func_CPU)
df["Hard_Memory"] = df["Hard_Memory"].apply(func_Memory)
print(df)