簡體   English   中英

添加列數據框

[英]add column data frame

我會在 CellID 列中添加一個數字來對它們進行分類。 dataframe 是這樣的:

umap
                           CellID  wnnUMAP_1  wnnUMAP_2
0      KO_d0_r1:AAACAGCCACCTGCTCx  -8.127543   1.593849
1      KO_d0_r2:AAACAGCCACGTAATTx  -7.246094  -4.566527
2      HT_d0_r1:AAACAGCCATAATGAGx   7.617473   2.449949
3      HT_d0_r2:AAACATGCACCTAATGx  -7.944949   6.633856

我的結果就是這個

 umap
                               CellID    wnnUMAP_1   wnnUMAP_2
    0      KO_d0_r1:AAACAGCCACCTGCTCx-0  -8.127543   1.593849
    1      KO_d0_r2:AAACAGCCACGTAATTx-1  -7.246094  -4.566527
    2      HT_d0_r1:AAACAGCCATAATGAGx-2   7.617473   2.449949
    3      HT_d0_r2:AAACATGCACCTAATGx-3  -7.944949   6.633856

我會將0 to KO_d0_r1, a -1 to KO_d0_r2, a -2 to HT_do_r1 and a -3 HT_d0_r2. 這只是一個例子,我有很多帶有前綴KO_d0_r1 ,ecc. 的字符串,所以我會通過后綴來區分它們。 我的嘗試是:

umap = umap.rename(columns = {'Unnamed: 0':'CellID'})

但它不起作用

您可以使用 .cat() 連接字符串。

df["CellID"] = df["CellID"].str.cat([df.index.map(str)], sep="-")

https://pandas.pydata.org/docs/reference/api/pandas.Series.str.cat.html

import pandas as pd

data = [["KO_d0_r1:AAACAGCCACCTGCTCx", -8.127543, 1.593849],
        ["KO_d0_r2:AAACAGCCACGTAATTx", -7.246094, -4.566527],
        ["HT_d0_r1:AAACAGCCATAATGAGx", 7.617473, 2.449949]]

df = pd.DataFrame(data, columns=["CellID", "wnnUMAP_1", "wnnUMAP_2"])
df["CellID"] = df["CellID"].str.cat([df.index.map(str)], sep="-")

df 現在是:

                         CellID  wnnUMAP_1  wnnUMAP_2
0  KO_d0_r1:AAACAGCCACCTGCTCx-0  -8.127543   1.593849
1  KO_d0_r2:AAACAGCCACGTAATTx-1  -7.246094  -4.566527
2  HT_d0_r1:AAACAGCCATAATGAGx-2   7.617473   2.449949

另一種方法和更簡單的不需要映射的解決方案,特別是如果您有大量的唯一 CellID。

  1. 如果df['CellID']中沒有重復項:
df['CellID'] = df['CellID'] + '-' + (df.index + 1).astype(str)
  1. 如果df['CellID']包含重復項:
df
    CellID                      wnnUMAP_1   wnnUMAP_2
0   KO_d0_r1:AAACAGCCACCTGCTCx  -8.127543   1.593849
1   KO_d0_r2:AAACAGCCACGTAATTx  -7.246094   -4.566527
2   HT_d0_r1:AAACAGCCATAATGAGx  7.617473    2.449949
3   HT_d0_r2:AAACATGCACCTAATGx  -7.944949   6.633856
4   HT_d0_r2:AAACATGCACCTAATGx  -6.944949   2.633856
5   HT_d0_r2:AAACATGCACCTAATGx  -5.944949   3.633856

df = df.merge((df['CellID'].drop_duplicates() + '-' + (df['CellID'].drop_duplicates().index + 1).astype(str)).reset_index(name='CellID_classified').eval('CellID= CellID_classified.str.split("-").str[0]').drop('index', axis=1), on='CellID', how='left').drop('CellID', axis=1)

df
    wnnUMAP_1   wnnUMAP_2   CellID_classified
0   -8.127543   1.593849    KO_d0_r1:AAACAGCCACCTGCTCx-1
1   -7.246094   -4.566527   KO_d0_r2:AAACAGCCACGTAATTx-2
2   7.617473    2.449949    HT_d0_r1:AAACAGCCATAATGAGx-3
3   -7.944949   6.633856    HT_d0_r2:AAACATGCACCTAATGx-4
4   -6.944949   2.633856    HT_d0_r2:AAACATGCACCTAATGx-4
5   -5.944949   3.633856    HT_d0_r2:AAACATGCACCTAATGx-4

創建一個字典,其中包含前綴到感興趣的相應后綴值的映射,然后將CellID拆分為: ,其中n=1基本上最多拆分 1 次,然后調用Series.str.map傳遞字典映射 object。 您終於可以加入cellID列。

mapping = {'KO_d0_r1':'0', 'KO_d0_r2':'1', 'HT_d0_r1': '2', 'HT_d0_r2':'3'}

umap['CellID']=umap['CellID']\
               +'-'\
               +umap['CellID'].str.split(':', n=1).str[0].map(mapping)

OUTPUT

                         CellID  wnnUMAP_1  wnnUMAP_2
0  KO_d0_r1:AAACAGCCACCTGCTCx-0  -8.127543   1.593849
1  KO_d0_r2:AAACAGCCACGTAATTx-1  -7.246094  -4.566527
2  HT_d0_r1:AAACAGCCATAATGAGx-2   7.617473   2.449949
3  HT_d0_r2:AAACATGCACCTAATGx-3  -7.944949   6.633856

PS: map為無法映射的值返回NaN ,這可能會引發TypeError ,對於數據,我只是假設它總是會存在,否則,您可能想要處理它。

如果您不太關心足夠的內容並且只需要分配一個唯一的號碼,您也可以使用groupby然后調用ngroup()

umap['CellID'] = umap['CellID'] \
                 + '-' \
                 + (umap
                    .groupby(umap['CellID'].str.split(':', n=1).str[0], sort=False)
                    .ngroup()
                    .astype('str')
                    )

暫無
暫無

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

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