熊猫:从一行中选择多个列

时间:2014-01-13 10:36:29

标签: python pandas

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

所以,我有一个包含少量行(20到几百个)和少量列的数据帧。我使用了read_table pandas函数来获取.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])

......但这只会让我更加困惑。如果我传递print(col),我会打印某种df构造,而如果我传递print(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)

... spike是一个字典,键是ID。忽略dict部分,我可以进行计算(谢谢!),但如何使用数据帧ID访问字典?使用上面的代码,我只得到一个“Unhashable type:Series”错误。

以下是一些实际数据:

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

1 个答案:

答案 0 :(得分:1)

  1. df.groupby()不会修改/组df到位。因此,您必须将结果分配给新变量以进一步使用它。例如。 :

    grouped = df.groupby('Sequence')
    

    顺便说一句,在您提供的示例数据中,Sequence列中的所有数据都是唯一的,因此对该列进行分组不会有太大作用。
    此外,您通常不需要像在此处那样“迭代df”。要将函数应用于所有组,您可以直接对groupby结果执行此操作,例如df.groupby().apply(..)df.groupby().aggregate(..)

  2. 您能否提供一个更具体的例子,说明您希望将哪种功能应用于比率?

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

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

    axis=1表示您不想取一列的中位数(在行上),但是对于每一行(在列上)

  3. 另一个例子,为了计算每个ID的所有Ratio1的中位数,你可以这样做:

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

    在此您按ID进行分组,选择列Ratio1并计算每个组的中位数值。


    更新:您应该将问题分成单独的问题,但作为对新问题的回答:

    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)