python - 使用 pandas 转换数据框中的唯一值列

标签 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.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 的 LogRatio 值,但我不知道如何按板添加值。 我想要的是:

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的LogRatio值。 我知道如何获取所有板的 ADN103 值:

expreg = "ADN103_RAC."
ADN103 = df[df['Sample'].str.contains(expreg, regex=True)]
logRatio_ADN103 = ADN103['Log Ratio']

我尝试通过仅选择 ADN103 值在新列中进行转换,但无法获取它们的 LogRatio 值,它只是重新运行 bool 值

df['ADN103oftheplate'] = df.groupby('Plate')['Sample'].transform(lambda x: x.str.contains(expreg, regex=True))

不知道说清楚了没有。我尝试了很多方法,现在完全迷失了。

感谢您的帮助。

最佳答案

思考不同列的性质会很有帮助。在这种情况下,您的“Plate”和“Sample”列实际上看起来更像是索引信息。因此,首先我将“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_Value 分配给该数据帧延伸的新列。

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

关于python - 使用 pandas 转换数据框中的唯一值列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127001/

相关文章:

python - Matplotlib:覆盖 "ggplot"默认样式属性

python - 将 2 列与 pandas 中的列表值连接起来(避免重复和 NaN)

python - 递归神经网络 (RNN) - 忘记层和 TensorFlow

python - 如何允许从所有目录访问文件?

python - sqlalchemy 在删除之前更新另一个模型

python - postgres 找到所有者为 'abc' 的所有数据库?

python - 在 Pandas 数据帧上使用正则表达式的新列的多个条件

python - 连接来自 pickle 的 pandas 数据帧与来自内存字典的 pandas 数据帧 - 为什么内存中会失败?

python - Pandas 不会就地 fillna()

python - Pandas 数据框计数唯一列表