2014-01-13 274 views
0

我有一个脚本可以为我做事,但效率很低。我要求代码审查人员提供一些帮助,并被告知要尝试使用熊猫。这就是我所做的,但我很难理解它是如何工作的。我试着在这里阅读文档和其他问题,但我找不到任何答案。熊猫:从一行中选择多列

所以,我有一个数据帧与少量的行(20到几百)和较少的列数。我已经使用了read_table大熊猫函数来获取在.TXT格式的原始数据,它看起来像这样:

[ID1, Gene1, Sequence1, Ratio1, Ratio2, Ratio3] 
[ID1, Gene1, Sequence2, Ratio1, Ratio2, Ratio3] 
[ID2, Gene2, Sequence3, Ratio1, Ratio2, Ratio3] 
[ID2, Gene3, Sequence4, Ratio1, Ratio2, Ratio3] 
[ID3, Gene3, Sequence5, Ratio1, Ratio2, Ratio3] 

...有一大堆无关紧要的列一起。

我希望能够做的是从每个序列中选择所有比率,并对它们进行一些计算和统计(每个序列的所有3个比率,即)。我试过

df.groupby('Sequence') 
for col in df: 
    do something/print(col)/print(col[0]) 

......但这只会让我更困惑。如果我通过打印(col),我会打印某种df结构,而如果我通过打印(col [0]),我只能得到序列。据我可以在构造中看到,我应该仍然有所有其他列和他们的数据,因为groupby()不会删除任何数据,它只是通过一些输入列分组。我究竟做错了什么?

虽然我还没有得到那么多,但由于上述问题,我还希望我的脚本能够为每个ID选择所有比率并对它们执行相同的计算,但这次每个比率都是由本身(即ID1的所有行的Ratio1,Ratio2的相同等)。最后,为每个基因做同样的事情。

编辑:

所以,说我想执行的行中的每一个比这个计算,然后取这三个结果值的中位数:

df[Value1] = spike[data['ID']]/float(data['Ratio 1]) * (10**-12) * (6.022*10**23)/(1*10**6) 
df[Value2] = spike[data['ID']]/float(data['Ratio 2]) * (10**-12) * (6.022*10**23)/(1*10**6) 
df[Value3] = spike[data['ID']]/float(data['Ratio 3]) * (10**-12) * (6.022*10**23)/(1*10**6) 

...其中尖峰一个字典,并且这些键是这些ID。忽略字典部分,我可以进行计算(谢谢!),但是如何使用数据框ID访问字典?使用上面的代码,我只是得到一个“不可能的类型:系列”错误。

下面是一些真实的数据:

ID Gene Sequence Ratio1 Ratio2 Ratio3 
1 KRAS SFEDXXYR 15.822 14.119 14.488 
2 KRAS VEDAXXXLVR 9.8455 8.9279 16.911 
3 ELK4 IEXXXCESLNK 15.745 7.9122 9.5966 
3 ELK4 IEGXXXSLNKR 1.177 NaN  12.073 
+0

您可以给出一个很小但具有实际数据的样本数据集吗?所以我们可以尝试这些功能。 – joris

回答

1
  1. df.groupby()不修改/组df到位。所以你必须把结果赋给一个新变量以进一步使用它。例如。 :

    grouped = df.groupby('Sequence') 
    

    顺便说一句,在你给的数据。例如,在Sequence列中的所有数据都是独一无二的,所以分组该列不会做太大。
    此外,您通常不需要像在此处那样“遍历df”。要将功能应用于所有组,可以直接在组别结果上执行此操作,例如df.groupby().apply(..)df.groupby().aggregate(..)

  2. 你可以举一个更具体的例子来说明你想应用于比率的功能吗?

    要计算三个比率的中位数为每个序列(每行),你可以这样做:

    df[['Ratio1', 'Ratio2', 'Ratio3']].median(axis=1) 
    

    axis=1意味着你不想拿一列的中位数(超过行),但每行(在列)

另一个examle,计算所有比1的每个ID的中位数,你可以这样做:

df.groupby('ID')['Ratio1'].median() 

在这里,您通过组ID,选择列Ratio1并计算每个组的中值。


UPDATE:你应该分裂问题成单独的,但作为一个回答你的新问题:

data['ID']会给你ID列,所以你不能用它作为重点。您需要该列的一个具体值。要在数据帧的每一行上应用函数,可以使用apply

def my_func(row): 
    return spike[row['ID']]/float(row['Ratio 1']) * (10**-12) * (6.022*10**23)/(1*10**6) 

df['Value1'] = df.apply(my_func, axis=1) 
+0

1.对不起,我不清楚。我有一个新的df,我正在迭代,如上面的代码。 (df = df.groupby('Sequence') 2.我基本上想要每个序列的三个比率的中位数,以及其他一些统计计算(std,cv等)。所有Ratio1的ID1,Ratio2,Ratio3的中位数,然后是中位数的另一个中位数 – Sajber

+1

这对阅读这些文档以查看这些类型的groupby操作的示例非常有帮助:http://pandas.pydata.org/ pandas-docs/dev/groupby.html – Jeff

+0

哦,非常酷,Joris!如果我想对每个比率执行一些其他非标准计算,然后计算所得到的三个值的中位数呢?计算需要一个单独的字典中的值,其中ID与相应的三个比率必须作为关键字输入? – Sajber