簡體   English   中英

在我現有的熊貓數據框中添加一個新列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM