原始数据框为
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”与相同的索引相加。预先谢谢你。
答案 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)
根据执行此操作所需的速度,您可以考虑使用categoricals(dtype="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()))