【问题标题】:Calculating the difference of entry values in pd.DataFrame comparing multiple indices计算 pd.DataFrame 中条目值的差异比较多个索引
【发布时间】:2020-06-23 12:50:53
【问题描述】:

我想从包含多个碱基(A、C、G、T、U1 和 U 的数据的 pd.DataFrame 中插入每两个能量值差异的差异2) 用于每个环境中的每个基地,依此类推。我想到了类似fhe的东西。我想过遍历整个数据框,但它没有用,也绝对不是 pd.DataFrames 的用途。
例如,我希望在其“中性”和“正”值之间以 pbs 为单位负责基础 A 的差异,从而扩展每个基础、环境和更多标准的原则,这些标准可能会在未来添加。

虽然我听说过pandas.MultiIndex,但我没有太多经验,但这对我来说似乎是一个可能的解决方案,不是吗?

import seaborn as sns
import pandas as pd
import os

with open (os.path.join (os.environ ['HOME'], 'data.csv'), 'r') as f :
    df = pd.read_csv (f, index_col = 0, header = 0, thousands = None, decimal = '.')

df = df.loc [df ['base'].isin (['A', 'C', 'G', 'U'])]

# one way I tried
pos = df.loc [df ['charge'] == 'pos']
neg = df.loc [df ['charge'] == 'neg']
neu = df.loc [df ['charge'] == 'neu']

df.loc [df ['charge'] == 'neg', 'difference'] = neg ['energy'] - neu ['energy']
df.loc [df ['charge'] == 'pos', 'difference'] = pos ['energy'] - neu ['energy']

# another way I tried
for posneg in ['pos', 'neg'] :
    df.loc [df ['charge'] == posneg, 'difference'] = lit.query ("(charge == 'neu') - (charge == '@posneg')")

~/data.csv

,environment,base,charge,energy,type
0,pbs,A,neg,0.34835,1
1,pbs,C,neg,0.40194,2
2,pbs,G,neg,0.34959,1
3,pbs,T,neg,0.40738,2
4,pbs,U1,neg,0.34904,2
5,pbs,U2,neg,0.40016,2
6,pbs,A,neu,0.40151,3
7,pbs,C,neu,0.34494,3
8,pbs,G,neu,0.40193,3
9,pbs,T,neu,0.34458,3
10,pbs,U1,neu,0.34646,3
11,pbs,U2,neu,0.40871,3
12,pbs,A,pos,0.34047,2
13,pbs,C,pos,0.40157,2
14,pbs,G,pos,0.34232,2
15,pbs,T,pos,0.40854,2
16,pbs,U1,pos,0.34611,2
17,pbs,U2,pos,0.34414,2
18,polymeric,A,neg,0.28333,2
19,polymeric,C,neg,0.46908,3
20,polymeric,G,neg,0.33224,3
21,polymeric,T,neg,0.35825,1
22,polymeric,U1,neg,0.33033,3
23,polymeric,U2,neg,0.39167,3
24,polymeric,A,neu,0.36964,2
25,polymeric,C,neu,0.33979,2
26,polymeric,G,neu,0.41815,3
27,polymeric,T,neu,0.30786,2
28,polymeric,U1,neu,0.40727,1
29,polymeric,U2,neu,0.36719,3
30,polymeric,A,pos,0.38173,1
31,polymeric,C,pos,0.35060,3
32,polymeric,G,pos,0.37617,1
33,polymeric,T,pos,0.44172,2
34,polymeric,U1,pos,0.31267,3
35,polymeric,U2,pos,0.34478,2

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    代码中只反映了第一个减法,因为不清楚有多少计算。我认为遵循这种格式很容易。

    工艺流程:

    1. 数据框变换
    2. 消除多个索引。
    3. 更改列名
    4. 计算 A,计算 B
    # Extract the condition
    df = df.loc[df['base'].isin (['A','C','G','U'])]
    # long to wide
    df = df.set_index(['environment','base','charge']).unstack()
    # Eliminate multi-indexing
    df.columns = df.columns.droplevel()
    # Eliminate indexing
    df = df.rename_axis(columns=None).reset_index()
    # rename columns
    df.columns = ['environment','base','neg','neu','pos','neg_type','neu_type','pos_type']
    df['neg-neu'] = df['neg']-df['neu']
    df['pos-neu'] = df['pos']-df['neu']
    df
        environment base    neg neu pos neg_type    neu_type    pos_type    neg-neu pos-neu
    0   pbs A   0.34835 0.40151 0.34047 1   3   2   -0.05316    -0.06104
    1   pbs C   0.40194 0.34494 0.40157 2   3   2   0.05700 0.05663
    2   pbs G   0.34959 0.40193 0.34232 1   3   2   -0.05234    -0.05961
    3   polymeric   A   0.28333 0.36964 0.38173 2   2   1   -0.08631    0.01209
    4   polymeric   C   0.46908 0.33979 0.35060 3   2   3   0.12929 0.01081
    5   polymeric   G   0.33224 0.41815 0.37617 3   3   1   -0.08591    -0.04198
    

    【讨论】:

    • 我在df.columns = [list] 行(第5 行)旁边得到一个ValueError: Length mismatch: Expected axis has 8 elements, new values have 11 elements。我尝试了重新创建~/data.csv 并将其放入mwe.py 的解决方案,得到相同的错误。 'neg_idx','neu_idx','pos_idx' 列最后没有出现在 df 中,但这有关系吗?
    • 如果您能解释一下单个步骤(其中发生了什么以及为什么需要在这里)以及您选择这种可能性的原因,我将不胜感激。
    • 我再次运行它进行检查。正如您所指出的,不需要该列。修复代码并添加 cmets。
    猜你喜欢
    • 2022-11-01
    • 2021-06-15
    • 1970-01-01
    • 2020-07-25
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多