簡體   English   中英

根據另一列的值替換 Pandas dataframe 中的特定值

[英]Replacing specific values in a Pandas dataframe basing on the values of another column

我有一個類似於此的 DataFrame:

Chr  Start_Position End_Position Type
1    10000          10001        SNP
5    45321          45327        INS
12   44700          44710        DEL

我需要根據Type更改某些單元格的值:

  • SNP需要Start_Position + 1
  • INS需要End_Position + 1
  • DEL需要Start_Position + 1

我的問題是我目前的解決方案非常冗長。 我試過的( dataframe是原始數據源):

snp_records = dataframe.loc[dataframe["Type"] == "SNP", :]
del_records = dataframe.loc[dataframe["Type"] == "DEL", :]
ins_records = dataframe.loc[dataframe["Type"] == "INS", :]

snp_records.loc[:, "Start_Position"] = snp_records["Start_Position"].add(1)
del_records.loc[:, "Start_Position"] = del_records["Start_Position"].add(1)
ins_records.loc[:, "End_Position"] = ins_records["End_Position"].add(1)

dataframe.loc[snp_records.index, "Start_Position"] = snp_records["Start_Position"]
dataframe.loc[del_records.index, "Start_Position"] = del_records["Start_Position"]
dataframe.loc[ins_records.index, "End_Position"] = ins_records["End_Position"]

因為我必須為比示例更多的列(盡管類似的概念)這樣做,所以這變得非常冗長和冗長,並且可能容易出錯(事實上,我在輸入示例時犯了幾個錯誤)由於所有重復線。

這個問題與我的類似,但是這些值是預定義的,而我需要從數據本身中獲取它們。

你可以這樣做:

df.loc[df['Type'].isin(['SNP','INS']), 'Start_Position'] += 1
df.loc[df['Type'].eq('INS'), 'End_Position'] += 1

對於一般解決方案,您可以將列表傳遞給Series.isin並傳遞給DataFrame.loc以通過掩碼設置值:

start = ['SNP','DEL']
end = ['INS']

df.loc[df['Type'].isin(start), 'Start_Position'] += 1
df.loc[df['Type'].isin(end), 'End_Position'] += 1
print (df)
   Chr  Start_Position  End_Position Type
0    1           10001         10001  SNP
1    5           45321         45328  INS
2   12           44701         44710  DEL

在一個DataFrame.loc中傳遞兩列的另一種想法:

m = pd.concat([df['Type'].isin(start), df['Type'].isin(end)], axis=1)
df[[ 'Start_Position', 'End_Position']] += m.to_numpy()
print (df)
   Chr  Start_Position  End_Position Type
0    1           10001         10001  SNP
1    5           45321         45328  INS
2   12           44701         44710  DEL

或者:

m = np.vstack((df['Type'].isin(start), df['Type'].isin(end))).T
df[[ 'Start_Position', 'End_Position']] += m
print (df)
   Chr  Start_Position  End_Position Type
0    1           10001         10001  SNP
1    5           45321         45328  INS
2   12           44701         44710  DEL

嘗試使用np.where

start = ['SNP','DEL']
end = ['INS']

df['Start_Position'] = np.where(df['Type'].isin(start),df['Start_Position']+1,df['Start_Position'])

df['End_Position'] = np.where(df['Type'].isin(end ),df['End_Position']+1,df['End_Position'])

暫無
暫無

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

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