[英]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。
df['CellID']
中沒有重復項:df['CellID'] = df['CellID'] + '-' + (df.index + 1).astype(str)
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.