Расширение Сравнения столбцов данных и возврата разницы - PullRequest
1 голос
/ 01 апреля 2019

Это расширение моего предыдущего вопроса по адресу: Сравнение столбцов данных и возвращение разницы .

После сравнения столбцов всех фреймов данных в моей коллекции из 37 фреймов данных я обнаружил, что некоторые из фреймов данных имеют одинаковые столбцы, а некоторые - разные. Таким образом, теперь необходимо сравнить эти разные кадры данных и вернуть разницу. Этот шаг должен продолжаться до тех пор, пока все кадры данных не будут отсортированы по двум группам, то есть кадры данных с одинаковыми столбцами в одной группе и разные кадры данных столбцов во второй группе.

например:


df = [None] * 6

df[0] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]})
df[1] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]})
df[2] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'x':[7,8,3], 'y':[1,5,3]})
df[3] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'c':[7,8,3], 'd':[1,5,3]})
df[4] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'x':[7,8,3], 'z':[1,5,3]})
df[5] = pd.DataFrame({'a':[1,2,3],'b':[3,4,5], 'x':[7,8,3], 'y':[1,5,3]})

# code to group the dataframes into similar and different cols groups

nsame = []
same = []
    for i in range(0, len(df)):
        for j in range(i+1, len(df)):
            if not (df[i].columns.equals(df[j].columns)):
                nsame.append(j)
            else:
                same.append(i)

Когда я печатаю вышеуказанный код для той же группы (такой же), вывод будет таким:

print(same)
[0, 0, 1, 2]

Желаемый вывод:

print(same)
[0, 1, 3]

Возможно, мне нужна рекурсивная функция, чтобы сгруппировать все похожие столбцы в одну группу и все разные кадры данных столбцов в другую группу. Однако сложная часть заключается в том, что может существовать более двух групп. Например, в приведенном выше коде есть 3 группы:

Group1: df[0], df[1], df[3]
Group2: df[2], df[5]
Group3: df[4]

Может кто-нибудь помочь здесь?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Вот один из способов

s=pd.Series([','.join(x) for x in df])
s.groupby(s).groups # the out put here already make the dfs into groups 
Out[695]: 
{'a,b,c,d': Int64Index([0, 1, 3], dtype='int64'),
 'a,b,x,y': Int64Index([2, 5], dtype='int64'),
 'a,b,x,z': Int64Index([4], dtype='int64')}

[y.index.tolist() for x , y in s.groupby(s)]
Out[699]: [[0, 1, 3], [2, 5], [4]]
0 голосов
/ 01 апреля 2019

Не проще ли передать все имена столбцов в виде другого кадра данных pandas, например:

a - b - c - d
a - b - c - d
a - b - x - y
...

и просто сделать простое группирование по столбцам

ряд count () в течениеGroupby Res будет желаемый результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...