如果熊猫数据框无法分配给函数调用

时间:2019-02-14 19:27:26

标签: python pandas

我有几列的数据框。列之一是“类别”,由字符串组成,如下所示: ...:-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. 我的错误在哪里?

1 个答案:

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