簡體   English   中英

為 dataframe 中的變量列表創建缺失的虛擬指標變量,並在 python 中使用特定值(熊貓)

[英]Creating missing dummy indicator variable for a list of variable in a dataframe with specific values in python (pandas)

我在 pandas 中有一個大型數據集。 為簡潔起見,假設我有以下內容

df = pd.DataFrame({'col1': [101,101,101,201,201,201,np.nan],
                  'col2':[123,123,124,np.nan,321,321,456],
                 'col3':['a',0.7,0.6,1.01,2,1,2],
                 'col4':['w',0.2,'b',0.7,'z',2,3],
                 'col5':[21,'z',0.3,2.3,0.8,'z',1.001],
                 'col6':[11.3,202.0,0.2,0.3,41.0,47,2],
                 'col7':['A','B','C','D','E','F','G']})

初始數據

現在我想創建帶有后綴_missing的分類變量,這樣對於數據集中包含缺失nan的任何列,都應該創建一個新列(變量),其值為1表示“nan”值,否則為0 例如,對於col1col2 ,它們對應的變量將是col1_missingcol2_missing

然后對於像col3這樣在應該是數字的列中有字母的列,我會喜歡與上述類似的結果,但類別的級別會隨着不同字母的數量而增加。 例如,對應於col4的新列將是col4_missing並且將包含 0 用於非字母, 1用於b2用於w3用於z 因此生成的框架應如下所示:

結果數據框

有沒有 python function 或 package 可以做到這一點? 作為一個新手,老實說,我對此感到不知所措,我將不勝感激在這方面的任何幫助。

您可以map字典中的值:

def flag(s):
    flags = {'b': 1, 'w': 2, 'z': 3}
    return s.fillna('b').map(lambda x: flags.get(x, 0))

out = (pd
 .concat([df, df.apply(flag).add_suffix('_missing')], axis=1)
 .sort_index(axis=1)
 )

Output:

    col1  col1_missing   col2  col2_missing  col3  col3_missing col4  col4_missing   col5  col5_missing   col6  col6_missing col7  col7_missing
0  101.0             0  123.0             0     a             0    w             2     21             0   11.3             0    A             0
1  101.0             0  123.0             0   0.7             0  0.2             0      z             3  202.0             0    B             0
2  101.0             0  124.0             0   0.6             0    b             1    0.3             0    0.2             0    C             0
3  201.0             0    NaN             1  1.01             0  0.7             0    2.3             0    0.3             0    D             0
4  201.0             0  321.0             0     2             0    z             3    0.8             0   41.0             0    E             0
5  201.0             0  321.0             0     1             0    2             0      z             3   47.0             0    F             0
6    NaN             1  456.0             0     2             0    3             0  1.001             0    2.0             0    G             0

僅具有至少一個非零的列

def flag(s):
    flags = {'b': 1, 'w': 2, 'z': 3}
    return s.fillna('b').map(lambda x: flags.get(x, 0))

# flag values 
df2 = df.apply(flag).add_suffix('_missing')

# keep only columns with at least one flag
df2 = df2.loc[:, df2.ne(0).any()]

out = (pd
 .concat([df, df2], axis=1)
 .sort_index(axis=1)
 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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