我有一个我在4个循环中创建的dataFrame。我不确定这是否是最好的方法,但经过长时间的研究,我只设法创建一个数据框,其中包含长度为4的元组作为列名。我现在需要使用元组中条目的某些中的条件对所有列进行分组,而不是按顺序。这是我的一个例子:
import numpy as np
import pandas as pd
from collections import namedtuple
tuplekey = namedtuple("tuplekey", ["key1","key2","key3","key4"])
randomarray = np.random.rand(10)
list1 = []
for i in range(0,2):
list2 = []
for j in range(0,2):
list3 = []
for k in range(0,2):
list4 = []
for l in range(0,2):
key = tuplekey('I'+str(i), 'J'+str(j), 'K'+str(k), 'L'+str(l))
df1 = pd.DataFrame({key:[randomarray]})
list4.append(df1)
df2 = pd.concat(list4, axis=1)
list3.append(df2)
df3 = pd.concat(list3, axis=1)
list2.append(df3)
df4 = pd.concat(list2, axis=1)
list1.append(df4)
df = pd.concat(list1, axis=1)
list(df.columns.values)
>>> [('I0', 'J0', 'K0', 'L0'),
('I0', 'J0', 'K0', 'L1'),
('I0', 'J0', 'K1', 'L0'),
('I0', 'J0', 'K1', 'L1'),
('I0', 'J1', 'K0', 'L0'),
('I0', 'J1', 'K0', 'L1'),
('I0', 'J1', 'K1', 'L0'),
('I0', 'J1', 'K1', 'L1'),
('I1', 'J0', 'K0', 'L0'),
('I1', 'J0', 'K0', 'L1'),
('I1', 'J0', 'K1', 'L0'),
('I1', 'J0', 'K1', 'L1'),
('I1', 'J1', 'K0', 'L0'),
('I1', 'J1', 'K0', 'L1'),
('I1', 'J1', 'K1', 'L0'),
('I1', 'J1', 'K1', 'L1')]
我现在需要按“I1”分组,然后按“K1”和“K2”分组。
我尝试使用
group = df.groupby(["I1"])
但是这会出现以下错误:
ValueError:'I1'的石斑鱼不是1维
我知道这是错误的,因为我的列名是长度为4的元组,但我不知道怎么说
df.groupby(["I1",*,*,*])
其中每个*都是“通配符”。
我查找了该错误,发现this answer为其提供了解决方案。由于我有4个键而不是2个,所以我尝试了:
df1.rename(columns={ key[3] : {key[2] : { key[0]:key[1] }}}, inplace=True)
但这会产生错误
TypeError:不可用类型:'dict'
那么在这种情况下我怎么可以通过“I1”(以及“I1”和“K1”等进行分组)?
最后我想补充一点,我不需要需要将dataFrame的名称作为元组,我只需要保留每个循环的信息。我正在尝试使用Pandas,因为稍后我想使用seaborn绘制一些dataFrame。如果你认为有更好的方法来构建这个dataFrame,以便稍后我可以更容易地对它进行操作,请不要犹豫,告诉我这样做·
答案 0 :(得分:1)
要轻松创建包含16个以元组命名的列的DF,您可以执行以下操作:
import pandas as pd
import itertools
list_ind = [['I0', 'I1'], ['J0', 'J1'], ['K0', 'K1'], ['L0', 'L1']]
list_col = list(itertools.product(*list_ind)) # all permutations possible
df1 = pd.DataFrame(columns = list_col )
请注意DF为空。
如果你想要groupby
包含I1
的元组,你可以这样做:
list_I1 = [tup for tup in df1.columns if tup[0] == 'I1']
group = df1.groupby(list_I1)
这是你要找的吗?