Python 利用距离过滤数据帧
我有一个数据框,其中ID代表果蝇胚胎中的细胞,X和Y是这些细胞的坐标,mRNA是每个细胞中特定mRNA的数量Python 利用距离过滤数据帧,python,Python,我有一个数据框,其中ID代表果蝇胚胎中的细胞,X和Y是这些细胞的坐标,mRNA是每个细胞中特定mRNA的数量 ID X Y mRNA 0 0 149.492 189.153 0 1 1 115.084 194.082 2 2 2 135.331 194.831 7 3 3 136.965 184.493 2 4 4 124.025
ID X Y mRNA
0 0 149.492 189.153 0
1 1 115.084 194.082 2
2 2 135.331 194.831 7
3 3 136.965 184.493 2
4 4 124.025 190.069 1
... ... ... ... ...
我使用以下代码计算此矩阵的距离:
(在另一个问题中,我得到了很多帮助)
这很好,但是,我真正想要的不是显示dist列,而是使用距离计算另一列,其中显示距离<10的任何细胞的mRNA值
任何帮助都将不胜感激 我无法复制您的数据,但是如果“dist”列包含您想要的内容,那么您可以过滤您的数据 像这样,
df_1 = df_1[df_1.dist<10]
更新:由于“dist”列本身就是列表,因此我们需要分别获取每个元素。若要获取单个元素,请说0元素(第一个):
df=df[df.b.str[0]首先考虑将列表值迁移到列中,然后将数据从宽格式迁移到长格式,以便正确比较mRNA和距离。最后过滤记录以获得所需的距离标准,将与自身相比较的零去掉:
# ... SAME AS ABOVE ...
# CREATES d0, d1, d2, d3, ... COLUMNS
dist_cols = ['d'+str(i) for i in range(len(df_1['Y']))]
df_1[dist_cols] = df_1['dist'].apply(pd.Series)
# RESHAPE DATA LONG
melted_df = df_1.melt(id_vars = ['ID', 'X', 'Y', 'mRNA'],
value_vars = dist_cols,
var_name = 'dist', value_name = 'dist_val')
# FILTER FOR DISTANCES (0, 10)
melted_df = melted_df[melted_df['dist_val'].between(0, 10, inclusive = False)]
您是要与dist
还是distance
进行比较?dist
是一个值列表,距离看起来像一个矩阵,那么您想将10与什么进行比较?列表/矩阵的长度还是列表/矩阵中的特定值?理想情况下,我根本不想打印列dist,而是相反打印一列,列上dist<10的细胞(ID)的mRNA值。dist是一个列表,那么您将10与之进行比较是什么?列表的长度还是列表中的特定值?对于列表中小于10的每个值,我希望与之关联的mRNA值。对不起,我编辑了上述代码:df_1=df_1[df_1.dist仍然不起作用,我认为这是因为dist是一个列表类型错误:'啊,你的'dist'是每行的值列表。该列表的哪个元素是距离?你可以得到该列表的每个元素。我将在上面添加一个更新,看起来像这样的df=df[df.b.str[0]谢谢,我试过了,我得到了这个错误:value\u vars=dist\u names,name错误:name'dist\u names'没有定义,应该是这样吗?``melled\u df=df\u 1.melt(id\u vars=['id','X','Y','mRNA',value\u vars=dist\u cols,var\u name='dist',value\u name='dist val')“哎呀,对不起打错了。是的,你的更正应该行得通。
print(df_1.head())
df=df[df.b.str[0]<10]
# ... SAME AS ABOVE ...
# CREATES d0, d1, d2, d3, ... COLUMNS
dist_cols = ['d'+str(i) for i in range(len(df_1['Y']))]
df_1[dist_cols] = df_1['dist'].apply(pd.Series)
# RESHAPE DATA LONG
melted_df = df_1.melt(id_vars = ['ID', 'X', 'Y', 'mRNA'],
value_vars = dist_cols,
var_name = 'dist', value_name = 'dist_val')
# FILTER FOR DISTANCES (0, 10)
melted_df = melted_df[melted_df['dist_val'].between(0, 10, inclusive = False)]