簡體   English   中英

根據其他列值/ Pandas -Python 在 dataframe 中創建 ID 列

[英]create ID column in dataframe based on other column values / Pandas -Python

我有一個像這樣的 dataframe

L_1  D_1   L_2  D_2    L_3    D_3         C_N
1    Boy                                 Boy||
1    Boy   1-1  play                     Boy|play|
1    Boy   1-1  play  1-1-21  car        Boy|play|car
1    Boy   1-1  play  1-1-1   online     Boy|play|online
2    Girl                                Girl||
2    Girl  2-1  dance                    Girl|dance|

我已經使用代碼創建了C_N選項卡

df['C_N'] = df[['D_1','D_2', 'D_3']].apply(lambda x: '|'.join(x), axis=1)

現在我想要另一列,我也可以在其中獲取特定組的 ID,我理想的 output 將是:

L_1  D_1   L_2  D_2    L_3    D_3      IDs        C_N
1    Boy                               1         Boy||
1    Boy   1-1  play                   1-1       Boy|play|
1    Boy   1-1  play  1-1-21  car      1-1-21    Boy|play|car
1    Boy   1-1  play  1-1-1   online   1-1-1     Boy|play|online
2    Girl                              2         Girl||
2    Girl  2-1  dance                  2-1       Girl|dance|

任何人都可以在這個問題上幫助我。 先感謝您!

我已經定義了一個自定義 function 來檢索所需的數據:

df = pd.DataFrame([
    ['1', 'Boy','','','',''],
    ['1', 'Boy','1-1','play','',''],
    ['1', 'Boy','1-1','play','1-1-21','car'],
    ['1', 'Boy','1-1','play','1-1-1','online'],
    ['2', 'Girl','','','',''],
    ['2', 'Girl','','dance','','']], columns=['L_1','D_1','L_2','D_2','L_3','D_3']
)
df['C_N'] = df[['D_1','D_2', 'D_3']].apply(lambda x: '|'.join(x), axis=1)

def get_data(x,y,z):
    result = []
    if x != '':
        result.append(x)
    if y != '':
        result.append(y)
    if z != '':
        result.append(z)
    return result[-1]

df['IDs'] = ''
df['IDs'] = df.apply(lambda row: get_data(row['L_1'], row['L_2'], row['L_3']), axis=1)

Output df

在此處輸入圖像描述

df = df.replace("^\s*$", np.nan, regex=True)

id_inds = df.filter(like="L_").agg(pd.Series.last_valid_index, axis=1)

# either this (but deprecated..)
df["IDs"] = df.lookup(df.index, id_inds)

# or this
df["IDs"] = df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(id_inds)]

首先我們用NaN替換空單元格,然后查看L_*列。 獲取給出列last_valid_index es。 然后我們可以lookup (已棄用)或 go 到 numpy 值並使用get_indexer進行精美的索引,

要得到

>>> df
   L_1   D_1  L_2    D_2     L_3     D_3              C_N     IDs
0    1   Boy  NaN    NaN     NaN     NaN            Boy||       1
1    1   Boy  1-1   play     NaN     NaN        Boy|play|     1-1
2    1   Boy  1-1   play  1-1-21     car     Boy|play|car  1-1-21
3    1   Boy  1-1   play   1-1-1  online  Boy|play|online   1-1-1
4    2  Girl  NaN    NaN     NaN     NaN           Girl||       2
5    2  Girl  2-1  dance     NaN     NaN      Girl|dance|     2-1

如果您願意,您現在可以將NaN替換為空字符串。

暫無
暫無

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

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