[英]Adding a new column in my existing dataframe in 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
基於 Column-1 我想在我的數據框中添加另一個新列。 如果有連續的值而不是添加具有相同索引的 'i'。 先感謝您。
你可以使用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
根據這需要執行的速度,您可以考慮使用分類( 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 個值的列對因式分解函數進行類別查找計時,為類別方法提供了快得多的計時。 這是因為您不是在調用函數,而是在讀取索引。
應該注意的是,涉及初始設置開銷(也顯示為完成),因此如果您只執行一次,factorize 函數會更好。
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()))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.