python - 有效地将具有混合文本值和 None 的列转换为整数列表

标签 python pandas dataframe

假设我有一个包含值的列

data = pd.DataFrame([['1,2,3'], ['4,5,6'], [无]])

我希望输出是:

[[1,2,3]],[[4,5,6]],[无]]

换句话说,将逗号分隔的字符串拆分为列表,同时忽略 None 值。

此函数适用于apply:

def parse_text_vector(s):
    if s is None:
        return None
    else:
        return map(int, s.split(','))

如本例所示:

df = pd.DataFrame([['1,2,3'], ['4,5,6'], [None]])
result = df[0].apply(parse_text_vector)

但是在数百万行中,这会变得相当慢。我希望通过做一些类似的事情来提高运行时间

parse_text_vector(df.values),但这会导致:

In [61]: parse_text_vector(df.values)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-61-527d5f9f2b84> in <module>()
----> 1 parse_text_vector(df.values)

<ipython-input-49-09dcd8f24ab3> in parse_text_vector(s)
      4         return None
      5     else:
----> 6         return map(int, s.split(','))

AttributeError: 'numpy.ndarray' object has no attribute 'split'

我怎样才能让它发挥作用?或者以其他方式对其进行优化,以便处理我的百万行数据帧不需要花费数十分钟?

最佳答案

使用df.str.split,然后转换为列表:

In [9]: df
Out[9]: 
    Col1
0  1,2,3
1  4,5,6
2   None

In [10]: df.Col1.str.split(',').tolist()
Out[10]: [['1', '2', '3'], ['4', '5', '6'], None]

要将内部列表元素转换为整数,您可以在列表理解中使用 map 进行转换:

In [22]: [list(map(int, x)) if isinstance(x, list) else x for x in df.Col1.str.split(',').tolist()]
Out[22]: [[1, 2, 3], [4, 5, 6], None]

关于python - 有效地将具有混合文本值和 None 的列转换为整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747393/

相关文章:

python - 如何尽快将所有数据分组?

python - Robot Framework - 检查 xpath 定义的元素是否存在

python - 正则表达式仅匹配从左到右阅读的最后一次出现

python - 从 Pandas 的每组中抽取 n 行

python - 如何将多个值的单行拆分为多个单独的行

python - Pandas 将多个数据帧合并到一个时间索引上,并使用所有其他数据帧的最新值

python - 将 y 轴自动缩放为 pyqtgraph 中的可见数据

pandas - 如果数据框中某些列大于另一个值并按另一列分组,则计算行数

python - pandas 数据透视函数中索引的重复条目

python - 我不能按列名提取数据?