我正在分析文件类型为AnnData
的.h5ad
文件。
我已经基于某些群集程序创建了单独的列表,并根据它们的群集编号(即x1
,x2
,x3
,x4
来命名列表。 ..)
现在,我想取每个列表中所有单独行的均值。当然,可以通过创建多个循环来轻松完成此操作,但是我认为尝试在单个循环中执行此操作会很有趣。
针对单个列表执行此操作的代码如下:
means1 = []
for q in range(0, len(x1.var)):
means1.append(np.mean(x1.X[:, q2])
现在,我希望能够用可变数字代替means1
和x1
。
对于means1
,可以通过将其设为字典并与for
一起使用第二个range(0, number)
来解决,如下所示:
x = {}
for q1 in range(0, 20):
for q2 in range(0, len(x1.var)):
x['mean' + q1] = np.mean(x1.X[:,q2])
但是因为我在x1
中使用的变量已经存在,所以不可能仅使用'x' + q1
这样的字符串格式,因为str
没有属性{{1 }}。
有没有办法做到这一点,或者我应该接受那是不可能的吗?
答案 0 :(得分:2)
我已经基于某些群集程序创建了单独的列表,并根据它们的群集编号(即x1,x2,x3,x4 ..)来命名列表
通常,当您发现自己使用这种命名方案时,您确实希望使用列表或字典。
答案 1 :(得分:1)
第一个主意:您可以在外部循环中遍历所有列表,然后将第二个主意应用于此。然后为x
中的每个列表创建一个下标。这样,您将拥有3个用于所有内容的循环,而不是每个列表一个:
x = {}
list_number = 1
for list in x1, x2, x3, x4:
for q1 in range(0, 20):
for q2 in range(0, len(list.var)):
x['x{}'.format(list_number)]['mean' + str(q1)] = np.mean(list.X[:,q2])
list_number += 1
我们也可以用dict理解替换循环(实际上并没有消除循环,而是缩短了代码):
x['x{}'.format(list_number)] = {'mean'+str(q1): np.mean(list.X[:,q2]) for q2 in range(0, len(list.var))}
话虽这么说,但我不知道确切的数据结构,但有格式
lists = {'x1': [the_list], 'x2': [other_list], ...}
对于此类任务总是更好。由于没有真正好的方法来get the name of a variable,因此将它们存储在字典中作为字符串键可以更轻松地使用它们。这使您可以执行以下操作:
means = {name: {'mean'+ str(q + 1): np.mean(lists[name].X[:,q]) for q in range(len(lists[name].var))} for name in lists}
将返回以下形式的字典
means = {'x1': {'mean1': mean_1, 'mean2': mean_2, ...}, 'x2': {'mean1': mean_1,...}...}
不可能用一个循环来完成所有这些操作,至少就现在的数据结构而言是不可能的,因为您必须迭代至少两个可迭代对象:
所有列表;
每个元素的所有元素都列出了变量。
答案 2 :(得分:0)
一种简单的解决方案是用所有df = pd.concat([
df.select_dtypes([], ['object']),
df.select_dtypes(['object']).apply(pd.Categorical, ordered=True)
], axis=1).reindex(df.columns, axis=1)
变量构建一个列表,然后对其进行迭代。
也许是这样的:
x
这对您有用吗?