![](/img/trans.png)
[英]Selecting the value in a row closest to zero in a pandas DataFrame with multiple columns
[英]Pandas: selecting multiple columns from one row
我有一个脚本可以为我做事,但是效率很低。 我向代码审查员寻求帮助,并被告知尝试使用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选择所有比率并对它们进行相同的计算,但是这次是每个比率本身(即Ratio1对于ID1的所有行,对于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访问字典? 使用上面的代码,我仅收到“ 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
df.groupby()
不会在原位置修改/分组df
。 因此,您必须将结果分配给新变量才能进一步使用它。 例如:
grouped = df.groupby('Sequence')
顺便说一句,在您提供的示例数据中,“ Sequence
列中的所有数据都是唯一的,因此对该列进行分组不会有太大作用。
此外,您通常不需要像在此那样“遍历df”。 要将功能应用于所有组,可以直接在groupby结果上执行此操作,例如df.groupby().apply(..)
或df.groupby().aggregate(..)
。
您能否举一个更具体的例子说明要对比率应用哪种功能?
要计算每个序列(每一行)的三个比率的中位数,您可以执行以下操作:
df[['Ratio1', 'Ratio2', 'Ratio3']].median(axis=1)
axis=1
表示您不希望获取一列(行中)的中位数,而是获取每一行(列中)的中位数
另一个示例,要计算每个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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.