我有几列的数据框。列之一是“类别”,由字符串组成,如下所示:
...:-U campus -u stevendu -l h_data=4G,h_rt=86400,h_vmem=4G -pe single 1:...
在类别字段中,我需要提取h_data
数据,将值转换为千兆字节(请参见下面的说明),并使其成为新列。
如果h_data
的值以“G”
或“g”
结尾,则数据以“千兆字节”为单位。如果值以“m”
或“M”
结尾,则数据以兆字节为单位。
例如,如果类别字段具有h_data=2048M,h_rt=86400,exclusive=TRUE
,则提取2048M,并将其转换为2048/1024 = 2(千兆字节)。
我是通过以下方式做到的:
match = re.search('(h_data=(\d{1})([G|M]))', str(df.category))
if match.group(3) == 'G': # h_data in GB, no convertion
df('h_data') = match.group(2)
elif match.group(3) == 'M': # h_data in MB, convert it to GB
df('h_data') = str(float(match.group(2))/1024)
else: # h_data in KB, convert it to GB
df('h_data') = float(match.group(2))/1048576
但是我得到了SyntaxError: can't assign to function call.
我的错误在哪里?
答案 0 :(得分:0)
我认为您想使用str.extract:
In [11]: df
Out[11]:
h_data
0 123G
1 456M
2 789
In [12]: res = df.h_data.str.extract('(\d+)([G|M]?)')
In [13]: res[0] = res[0].astype(int)
In [14]: res
Out[14]:
0 1
0 123 G
1 456 M
2 789
现在,您可以在何处适当地将数字相乘:
In [15]: res[0].where(res[1] == 'G', (res[0] / 1024).where(res[1] == 'M', res[0] / 1048576))
Out[15]:
0 123.000000
1 0.445312
2 0.000752
Name: 0, dtype: float64
注意:您也可以在此处使用申请。
In [21]: def normalize(row):
...: if row[1] == "G":
...: return row[0]
...: elif row[1] == "M":
...: return row[0] / 1024.
...: else:
...: assert not row[1]
...: return row[0] / 1048576.
...:
In [22]: res.apply(normalize, axis=1)
Out[22]:
0 123.000000
1 0.445312
2 0.000752
dtype: float64