Python 使用唯一值转换数据帧中的列
我有以下数据帧:Python 使用唯一值转换数据帧中的列,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: datas = [['RAC1','CD0287',1.52,1.40,1.45,1.51], ['RAC1','CD0695',2.08,1.40,1.45,1.51], ['RAC1','ADN103-1',2.01,1.40,1.45,1.51], ['RAC3','CD0258',1.91,1.38,1.43,1.45], ['RAC3','ADN103-3',1.66,1.38,1.43,1.45], ['RAC8','CD0558',1.32,1.42,1.48,1
datas = [['RAC1','CD0287',1.52,1.40,1.45,1.51], ['RAC1','CD0695',2.08,1.40,1.45,1.51], ['RAC1','ADN103-1',2.01,1.40,1.45,1.51], ['RAC3','CD0258',1.91,1.38,1.43,1.45], ['RAC3','ADN103-3',1.66,1.38,1.43,1.45], ['RAC8','CD0558',1.32,1.42,1.48,1.53], ['RAC8','ADN103-8',2.89,1.42,1.48,1.53]]
labels = ['Plate', 'Sample', 'LogRatio', 'm1', 'm2', 'm3']
df = pd.DataFrame(data = datas, columns=labels)
Plate Sample LogRatio m1 m2 m3
RAC1 CD0287 1.52 1.40 1.45 1.51
RAC1 CD0695 2.08 1.40 1.45 1.51
RAC1 ADN103-1 2.01 1.40 1.45 1.51
RAC3 CD0258 1.91 1.38 1.43 1.45
RAC3 ADN103-3 1.66 1.38 1.43 1.45
RAC8 CD0558 1.32 1.42 1.48 1.53
RAC8 ADN103-8 2.89 1.42 1.48 1.53
我想添加一个新的列来计算m1、m2、m3的平均值M和ADN103的值对数比,但我不知道如何通过板块来添加一个值。
我想要的是:
df['M'] = (df['m1'] + df['m2'] + df['m3'] + LogRatio_ADN103_of_the_plate)/4
例如,对于我的数据帧的第一行,计算是:
df['M'] = (1.40 + 1.45 + 1.51 + 2.01) / 4
Plate Sample LogRatio m1 m2 m3 M
RAC1 CD0287 1.52 1.40 1.45 1.51 1,5925
RAC1 CD0695 2.08 1.40 1.45 1.51
RAC1 ADN103-1 2.01 1.40 1.45 1.51
RAC3 CD0258 1.91 1.38 1.43 1.45
RAC3 ADN103-3 1.66 1.38 1.43 1.45
RAC8 CD0558 1.32 1.42 1.48 1.53
RAC8 ADN103-8 2.89 1.42 1.48 1.53
因为2.01是板RAC1上ADN103的对数比值。
我知道如何获得所有板的ADN103值:
expreg = "ADN103_RAC."
ADN103 = df[df['Sample'].str.contains(expreg, regex=True)]
logRatio_ADN103 = ADN103['Log Ratio']
我尝试在一个新列中进行转换,只选择ADN103值,但无法获取它们的对数比值,它只是重新运行一个布尔值
df['ADN103oftheplate'] = df.groupby('Plate')['Sample'].transform(lambda x: x.str.contains(expreg, regex=True))
我不知道是否清楚。我尝试了很多方法,现在我完全迷路了
感谢您的帮助。思考一下您的不同专栏的性质是很有帮助的。在这种情况下,“板块”和“样本”列看起来更像索引信息。因此,首先,我将“Plate”列转换为索引,以便更容易对数据帧进行切片:
import pandas as pd
import numpy as np
datas = [['RAC1','CD0287',1.52,1.40,1.45,1.51], ['RAC1','CD0695',2.08,1.40,1.45,1.51], ['RAC1','ADN103-1',2.01,1.40,1.45,1.51], ['RAC3','CD0258',1.91,1.38,1.43,1.45], ['RAC3','ADN103-3',1.66,1.38,1.43,1.45], ['RAC8','CD0558',1.32,1.42,1.48,1.53], ['RAC8','ADN103-8',2.89,1.42,1.48,1.53]]
labels = ['Plate', 'Sample', 'LogRatio', 'm1', 'm2', 'm3']
df = pd.DataFrame(data = datas, columns=labels)
df.set_index('Plate', inplace=True)
然后,您可以循环“Plate”索引中的唯一值,并为数据帧的该段分配适当的Log_值到新列
for plate in df.index.unique():
indx = np.where(df.loc[plate, 'Sample'].str.contains('ADN'))[0][0]
temp_value = df.loc[plate, 'LogRatio'].iat[indx]
df.loc[plate, 'ADN_LogValues'] = temp_value
然后把最后四列相加,除以四
df['M'] = df.loc[:, 'm1':'ADN_LogValues'].sum(axis=1)/4.0
这将产生:
Sample LogRatio m1 m2 m3 ADN_LogValues M
Plate
RAC1 CD0287 1.52 1.40 1.45 1.51 2.01 1.5925
RAC1 CD0695 2.08 1.40 1.45 1.51 2.01 1.5925
RAC1 ADN103-1 2.01 1.40 1.45 1.51 2.01 1.5925
RAC3 CD0258 1.91 1.38 1.43 1.45 1.66 1.4800
RAC3 ADN103-3 1.66 1.38 1.43 1.45 1.66 1.4800
RAC8 CD0558 1.32 1.42 1.48 1.53 2.89 1.8300
RAC8 ADN103-8 2.89 1.42 1.48 1.53 2.89 1.8300
如果包含实际的代码来生成原始数据帧,这比复制和粘贴数字要好。我的数据框实际上来自我读到的一个csv文件,它不是一个小文件,但我创建了一个代码,使其具有与我的示例中相同的数据框。谢谢你的建议。谢谢你。它很管用。一旦我添加了我的M列,是否有可能将原始索引数据帧返回?当然,只需在末尾添加以下内容:df.reset_index(inplace=True)此问题中的公认答案对如何执行此操作给出了更全面的解释: