【问题标题】:Transform strings (from a pandas dataframe column that also contains integers) into integers将字符串(从也包含整数的 pandas 数据框列)转换为整数
【发布时间】:2018-01-18 23:15:55
【问题描述】:

我有一个 pandas 数据框,其中有一列包含整数和字符串。

我想保留整数并使用int.from_bytes 方法仅将该列的字符串转换为整数。这可能吗?

您还有其他建议吗?

我需要始终将出现在此列中的任何字符串(通常最多 3 个字符串)转换为相同的唯一整数。谢谢。

编辑:

对于迟到的回复和令人困惑的问题深表歉意。事实上,我确实尝试了各种不起作用的东西,但我的问题肯定不够清楚。为了说明问题,首先考虑可以使用以下代码将字符串转换为整数:

int.from_bytes(bytearray('CD', 'ascii'), byteorder='big', signed=False)  

其中“CD”是我要转换为整数的字符串。在这种情况下,'CD' 被转换为 int 17220。例如,'C2' 将被转换为 17202。

就我而言,我有一列包含整数和字符串。字符串通常是 2 或 3 个字符串,例如上面提到的字符串。我想转换此列,保持整数不变,并使用上述方法将字符串转换为整数。因此,例如列 [1, 'CD', 2, 'C2'] 应转换为 [1, 17220, 2, 17202]。

从@AlexanderMcFarlane 的回答中,我设法找到了这样的解决方案:

import re
regex = re.compile(r"[-+]?\d+(\.0*)?$")

def is_int(v):
    return regex.match(str(v).strip()) is not None  

def string_int(x):
    if is_int(x):
        return int(float(x))
    else:
        return int.from_bytes(bytearray(x, 'ascii'), byteorder='big', signed=False)  

示例

x = [1, 'CD', 2, 'C2', '5']
df = pd.DataFrame(x, columns=['col'])

In: df
Out:     col
     0   1
     1   CD
     2   2
     3   C2
     4   5  

In: df['col']=df['col'].apply(string_int)
    df  
Out:     col
     0   1
     1   17220
     2   2
     3   17202
     4   5  

非常感谢您的反馈。非常感谢@AlexanderMcFarlane

【问题讨论】:

  • 样本数据,输出,到目前为止你尝试了什么?
  • 请向我们展示你的努力! SO 不是编码服务,但我们“都”愿意提供帮助。并发布一个示例,说明您最终拥有什么以及您想要什么,以便我们更好地了解问题。那么你可能会得到你想要的答案。
  • @MarvinTaschenberger 我认为这很明显

标签: python pandas dataframe


【解决方案1】:

使用这些功能

import re
regex = re.compile(r"[-+]?\d+(\.0*)?$")

def is_int(v):
    return regex.match(str(v).strip()) is not None

def safe_int(x):
    if is_int(x):
        return int(float(x))
    else:
        return x

然后操作

df[column] = df[column].apply(safe_int)

示例

In [17]: map(safe_int, ['1.0', '1', 's', '23546.fdf'])
Out[17]: [1, 1, 's', '23546.fdf']

【讨论】:

  • 我每天都使用这种精确的逻辑将数百万个字符串转换为整数 - 因此,否决票并不是对正确性的反映
  • 我的猜测是反对者不喜欢您回答中的假设。例如,列中存在无法转换为整数的字符串,或者 OP 希望将这些无效字符串保留为列中的字符串(这些细节目前无法根据 OP 的问题模糊性确定)。因为如果这些假设不是这样,他们可能会得到更简单的东西。
  • 是的,不用担心,我只是想澄清这是绝对万无一失的转换方法,并看到了展示我的孩子并帮助某人的机会:)
  • @AlexanderMcFarlane 谢谢你的回答。由于我的问题含糊不清,您的代码并不是我想要的,但它帮助我想出了一个解决方案,虽然我不确定它是否是最有效的,请参见上文。
猜你喜欢
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多