我想創建一個可以將某些濃度轉換為納摩爾濃度的函式。所以我寫了這個函式:
def convert_molars(df, field_values, field_units):
if (df[field_units].str.contains('uM')): # 1 uM = 1000 nM
df[field_values] *= 1000
elif (df[field_units].str.contains('M')): # 1 M = 1000000000 nM
df[field_values] *= 1000000000
else: # 1 mM = 1000000 nM
df[field_values] *= 1000000
return df
我是這樣開始的:
standard_units = convert_molars(IC50_nonan_units, 'Standard Value', 'Standard Units')
standard_units.to_csv("standard_units.csv")
standard_units.head()
但我得到了這個錯誤:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我又嘗試了一個這樣的選擇:
def convert_molars_bool(df, field_values, field_units):
if (df[field_units].str == 'uM').bool(): # 1 uM = 1000 nM
df[field_values] *= 1000
elif (df[field_units].str == 'M').bool(): # 1 M = 1000000000 nM
df[field_values] *= 1000000000
else: # 1 mM = 1000000 nM
df[field_values] *= 1000000
return df
但我得到了這個:
AttributeError: 'bool' object has no attribute 'bool'
有人可以解釋一下我做錯了嗎?
uj5u.com熱心網友回復:
運算子==回傳一個布林值。在您的if和elif條件下,您試圖bool()在布林值上運行該方法。
def convert_molars_bool(df, field_values, field_units):
if (df[field_units].str == 'uM'): # 1 uM = 1000 nM
df[field_values] *= 1000
elif (df[field_units].str == 'M'): # 1 M = 1000000000 nM
df[field_values] *= 1000000000
else: # 1 mM = 1000000 nM
df[field_values] *= 1000000
return df
這應該作業
uj5u.com熱心網友回復:
df.loc[df[field_units].str.conatins('uM'), field_values] = 1000*df.loc[df[field_units].str.conatins('uM'), field_values]
df.loc[df[field_units].str.conatins('M'), field_values] = 1000000000*df.loc[df[field_units].str.conatins('M'), field_values]
df.loc[(~df[field_units].str.conatins('M')) & (~df[field_units].str.conatins('uM')), field_values] = 1000000*df.loc[(~df[field_units].str.conatins('M')) & (~df[field_units].str.conatins('uM')), field_values]
uj5u.com熱心網友回復:
看看df[field_units].str.contains('uM')給你什么。它應該是pandas Seriessbool的一個。
import pandas as pd
dct = {
'Standard Units': ['uM', 'M', 'D'],
'Standard Value': [23.34, 245.6, 102]
}
df = pd.DataFrame(dct)
print(df['Standard Units'].str.contains('uM'))
#0 True
#1 False
#2 False
#Name: Standard Units, dtype: bool
即使這不會引發錯誤,df[field_values] *= 1000也會乘以1000每一行。它對上一行代碼中的條件一無所知。
您要做的是將此邏輯單獨應用于每一行,而不是DataFrame作為一個整體。
為此,您可以使用for回圈或更好的df.apply().
df.apply接受一個函式來應用到每一列或每一行。
例如:
import pandas as pd
dct = {
'Standard Units': ['uM', 'M', 'D'],
'Standard Value': [23.34, 245.6, 102]
}
df = pd.DataFrame(dct)
def func(row):
if 'uM' in row['Standard Units']:
return row['Standard Value'] * 1000
elif 'M' in row['Standard Units']:
return row['Standard Value'] * 1000000000
else:
return row['Standard Value'] * 1000000
df['Standard Value'] = df.apply(func, axis=1)
print(df)
# Standard Units Standard Value
#0 uM 2.334000e 04
#1 M 2.456000e 11
#2 D 1.020000e 08
或者,如果您想保留您使用的相同函式簽名:
import pandas as pd
dct = {
'Standard Units': ['uM', 'M', 'D'],
'Standard Value': [23.34, 245.6, 102]
}
df = pd.DataFrame(dct)
def convert_molars(df, field_values, field_units):
# create a function to apply
def func(row):
if 'uM' in row[field_units]:
return row[field_values] * 1000
elif 'M' in row[field_units]:
return row[field_values] * 1000000000
else:
return row[field_values] * 1000000
# apply the function that was just created
df[field_values] = df.apply(func, axis=1)
# return the DataFrame
return df
df = convert_molars(df, 'Standard Value', 'Standard Units')
print(df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494878.html
上一篇:函式不回傳值,代碼正在運行
