从ndarray到可迭代列表/变量

时间:2018-03-12 19:43:31

标签: python pandas multidimensional-array

我有以下数组,它是探针的样本,探针,值的列表,描述其控件(不是所有控件都包含单词" control")和分子的布尔值探头的重量。该数组是使用pandas导入并合并模板和样本导入列表的结果。示例数组:

array([('Sample1', 'Control1',  846,  True, 130),
       ('Sample1', 'Control2',  527,  True, 202),
       ('Sample1', 'Control3',  493,  True, 274),
       ('Sample1', 'Control4',  426,  True, 418),
       ('Sample1', 'Control4',  191,  True, 490),
       ('Sample1', 'Probe1', 1647, False, 138),
       ('Sample1', 'Probe2', 1146, False, 170),
       ('Sample1', 'Probe3',  958, False, 210),
       ('Sample1', 'Probe4',  814, False, 242),
       ('Sample1', 'Probe5',  301, False, 282),
       ('Sample2', 'Control1', 1355,  True, 130),
       ('Sample2', 'Control2',  785,  True, 202),
       ('Sample2', 'Control3',  936,  True, 274),
       ('Sample2', 'Control4',  748,  True, 418),
       ('Sample2', 'Control4',  335,  True, 490),
       ('Sample2', 'Probe1', 2532, False, 138),
       ('Sample2', 'Probe2', 1679, False, 170),
       ('Sample2', 'Probe3', 1488, False, 210),
       ('Sample2', 'Probe4', 1387, False, 242),
       ('Sample2', 'Probe5',  500, False, 282),
       ('Sample3', 'Control1', 1701,  True, 130),
       ('Sample3', 'Control2',  936,  True, 202),
       ('Sample3', 'Control3', 1048,  True, 274),
       ('Sample3', 'Control4',  705,  True, 418),
       ('Sample3', 'Control4',  308,  True, 490),
       ('Sample3', 'Probe1', 2957, False, 138),
       ('Sample3', 'Probe2', 1994, False, 170),
       ('Sample3', 'Probe3', 1663, False, 210),
       ('Sample3', 'Probe4', 1300, False, 242),
       ('Sample3', 'Probe5',  545, False, 282)],
      dtype=[('FILENAME', 'O'), ('Probe', 'O'), ('Value', '<i8'), ('QC', '?'), ('MW', '<i8')])

此刻一切都在一起。每当我尝试根据探测器或布尔值迭代数组时,我得到包含所有样本的结果。

我想为每个样本生成保存在变量中的分离可迭代列表,例如:我可以取样本1,计算出那些标记为true的探测值的总和,将其存储在变量中稍后用这个号码做点什么。最好的方法是什么?

提前谢谢

添加更多信息:

理想情况下,我希望能够获取任何样本,并且对于该样本中的每个探针,只能返回该样本的值。

我希望能够获取探针值并将其除以True探针的总和,以便为每个样本的每个探针创建一个比率。

2 个答案:

答案 0 :(得分:0)

  

我想生成保存在变量中的分离的可迭代列表   对于每个样本,例如:我可以取样1,计算总和   对于那些标记为true的探测值,将其存储在a中   变量并稍后使用该数字执行某些操作。会是什么   最好的方法吗?

建议:不是一个接一个地创建大量新变量,而是一种更具可扩展性的方法是将结果包含在某种类型的数据结构中。

由于您已经在使用Pandas,如您所示,您可能需要在此处考虑Pandas groupby功能。在FILENAME上分组并将ValueQC之和取为真的示例:

>>> import pandas as pd

>>> data = pd.DataFrame(data)
>>> data[data.QC==1].groupby('FILENAME')['Value'].sum()
FILENAME
Sample1    2483
Sample2    4159
Sample3    4698
Name: Value, dtype: int64

现在,如果您真的想分配单独的变量,可以使用以下内容解压缩这些结果:

>>> s1, s2, s3 = data[data.QC==1].groupby('FILENAME')['Value'].sum()

>>> s1
2483

>>> s2
4159

>>> s3
4698

>>> s1, s2, s3
(2483, 4159, 4698)

根据对照探针的总和标准化所有探针:

>>> sums = data[data.QC==1].groupby('FILENAME', as_index=False)['Value'].sum()
>>> merged = data[data.QC==0].merge(sums, on='FILENAME', suffixes=('', '_sum'))
>>> merged['prop'] = merged['Value'] / merged['Value_sum']
>>> merged
   FILENAME   Probe  Value     QC   MW  Value_sum    prop
0   Sample1  Probe1   1647  False  138       2483  0.6633
1   Sample1  Probe2   1146  False  170       2483  0.4615
2   Sample1  Probe3    958  False  210       2483  0.3858
3   Sample1  Probe4    814  False  242       2483  0.3278
4   Sample1  Probe5    301  False  282       2483  0.1212
5   Sample2  Probe1   2532  False  138       4159  0.6088
6   Sample2  Probe2   1679  False  170       4159  0.4037
7   Sample2  Probe3   1488  False  210       4159  0.3578
8   Sample2  Probe4   1387  False  242       4159  0.3335
9   Sample2  Probe5    500  False  282       4159  0.1202
10  Sample3  Probe1   2957  False  138       4698  0.6294
11  Sample3  Probe2   1994  False  170       4698  0.4244
12  Sample3  Probe3   1663  False  210       4698  0.3540
13  Sample3  Probe4   1300  False  242       4698  0.2767
14  Sample3  Probe5    545  False  282       4698  0.1160

答案 1 :(得分:-1)

没有熊猫:

你有一组元组。 python中的元组是例如mytuple = (1, 3, 1)

要从元组使用中访问元素:

mytuple[0] # for the first element

为了识读列表,请尝试:

tupleList =[(1,3,1), (2,6,2)]
for el in tupleList:
    print(el[0]) # prints first element of all tuples in list