我的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
答案 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)