在我现有的熊猫数据框中添加新列

时间:2019-02-11 10:30:53

标签: python pandas

原始数据框为

column_one
1 
1
1
45
45
55
55
56

Expected Output
column-new   
i_1
i_1
i_1
i_2
i_2
i_3
i_3
i_4

基于列1,我想在数据框中添加另一个新列。 如果存在连续值,则将“ i”与相同的索引相加。预先谢谢你。

2 个答案:

答案 0 :(得分:2)

您可以使用pd.factorize。从文档中:

  

当重要的是识别不同的值时,可用于获取数组的数字表示形式。

因此它将把遇到的每个新值编码为枚举类型。之后,您只需将'i_'前缀添加到new_col

df['new_col'] = (df.col1.factorize()[0] + 1).astype(str)
df['new_col'] = 'i_' + df.new_col

输出

    col1 new_col
0     1     i_1
1     1     i_1
2     1     i_1
3    45     i_2
4    45     i_2
5    55     i_3
6    55     i_3
7    56     i_4

答案 1 :(得分:0)

根据执行此操作所需的速度,您可以考虑使用categoricalsdtype="category"),因为它们在处理大型数据集时应该非常快。

如果您将数据作为category数据类型导入,则这已经确定了哪些是唯一值。

df["col1"] = df["col1"].astype('category')

然后,您可以在此处实现前导“ i_”并输出类别值,并记住要进行扩展,以便以1而不是0开头:

df['newcol1'] = "i_" + (df["col1"].cat.codes + 1).astype(str)

输出

  col1 newcol1
0    1     i_1
1    1     i_1
2    1     i_1
3   45     i_2
4   45     i_2
5   55     i_3
6   55     i_3
7   56     i_4

时间

由于代码只是在读取类别索引,因此针对因分解函数对0到1000之间的10,000,000值的列进行类别查找计时会比类别方法快得多。这是因为您不是在调用函数,而是在读取索引。

请注意,这涉及初始设置开销(也显示为完成),因此如果只执行一次分解因子功能会更好。

Categoricals: 0 ms
Factorize: 2092 ms
Categoricals Converstion: 3253 ms

计时代码:

import numpy as np
import pandas as pd
import time

def timing(label, fn):
    t0 = time.time()
    fn()
    t1 = time.time()
    print '%s: %d ms' % (label, int((t1 - t0) * 1000))


df = pd.DataFrame(np.random.randint(low=0, high=1000, size=(100000000, 1)), columns=["col1"])

df["col1"] = df["col1"].astype('category')

timing('Categoricals', lambda: (df.col1.cat.codes))

timing('Factorize', lambda: (df.col1.factorize()))