如何将列名称为元组的dataFrame分组?

时间:2018-04-26 17:42:58

标签: python pandas pandas-groupby

我有一个我在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,以便稍后我可以更容易地对它进行操作,请不要犹豫,告诉我这样做·

1 个答案:

答案 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)

这是你要找的吗?