Pandas Dataframe создает уникальный столбец - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть этот фрейм данных: enter image description here

Я хочу добавить каждый столбец как duration + credit_amount, поэтому я создал следующий алгоритм:

def automate_add(add):
  for i, column in enumerate(df):
    for j, operando in enumerate(df):
        if column != operando:
            columnName = column + '_sum_' + operando
            add[columnName] = df[column] + df[operando]

с выводом:

enter image description here

  1. duration_sum_credit_amount
  2. duration_sum_installment_commitment
  3. credit_amount_sum_duration
  4. credit_amount_sum_installment_commitment
  5. installment_commitment_sum_duration
  6. installment_commitment_sum_credit_amount

Однако, зная, что duration + credit_amount = credit_amount + duration.Я не хотел бы иметь повторные столбцы.Ожидая этого результата от функции:

  1. duration_sum_credit_amount
  2. duration_sum_installment_commitment
  3. credit_amount_sum_installment_commitment

Как я могу это сделать?

Я пытаюсь использовать хэш-наборы, но, похоже, работает только в сериях панд [1] .

РЕДАКТИРОВАТЬ: Рамка данных: https://www.openml.org/d/31

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Используйте ниже, должно работать быстрее:

import itertools

my_list=[(pd.Series(df.loc[:,list(i)].sum(axis=1),\
name='_sum_'.join(df.loc[:,list(i)].columns))) for i in list(itertools.combinations(df.columns,2))]    
final_df=pd.concat(my_list,axis=1)
print(final_df)

  duration_sum_credit_amount  duration_sum_installment_commitment  \
0                        1175                                   10   
1                        5999                                   50   
2                        2108                                   14   
3                        7924                                   44   
4                        4894                                   27   

   credit_amount_sum_installment_commitment  
0                                      1173  
1                                      5953  
2                                      2098  
3                                      7884  
4                                      4873  

Объяснение : print(list(itertools.combinations(df.columns,2))) дает:

[('duration', 'credit_amount'),
('duration', 'installment_commitment'),
 ('credit_amount', 'installment_commitment')]

Пост, который делает:

for i in list(itertools.combinations(df.columns,2)):
    print(df.loc[:,list(i)])
    print("---------------------------")

печатает комбинации столбцов вместе.поэтому я просто суммировал его по оси = 1, вызвал его в pd.series и дал ему имя, присоединившись к ним.

Публикуйте это, просто добавьте их в список и объедините их по оси = 1, чтобы получитьконечный результат.:)

0 голосов
/ 17 февраля 2019

Вы уже указали на itertools.combinations, который является правильным инструментом здесь, и сэкономит вам немного для циклов и проблемы с повторяющимися столбцами.См. документацию для получения более подробной информации о перестановках, комбинациях и т. Д.

Сначала давайте создадим DataFrame, чтобы мы могли воспроизвести пример:

import pandas as pd
from itertools import combinations

df = pd.DataFrame({
    'a': [1,2,3],
    'b': [4,5,6],
    'c': [7,8,9]
})
>>> df
    a   b   c
0   1   4   7
1   2   5   8
2   3   6   9

СейчасДавай приступим к работе.Идея состоит в том, чтобы получить все combinations столбцов, а затем составить словарь, чтобы получить что-то вроде {column_name: sum}.Вот оно:

>>> pd.DataFrame({c1 + '_sum_' + c2: df[c1] + df[c2] 
                  for c1, c2 in combinations(df.columns, 2)})

    a_sum_b a_sum_c b_sum_c
0   5       8       11
1   7       10      13
2   9       12      15

Обратите внимание, что вы можете заменить sum любой другой функцией, которая работает с двумя pd.Series.

0 голосов
/ 17 февраля 2019

Функция может иметь еще одно условие if, чтобы проверить, добавлено ли добавленное связывание в качестве столбца к кадру данных, как показано ниже:

def automate_add(add):
  columnLst=[]
  #list where we will add column names to avoid the associate sum columns
  for i, column in enumerate(df):
    for j, operando in enumerate(df):
        if column != operando:
            if operando + '_sum_' + column not in columnLst:
                columnName = column + '_sum_' + operando
                add[columnName] = df[column] + df[operando]
                columnLst.append(columnName)

Я не проверял это на ваших данных.Попробуйте и дайте мне знать, если это не работает.

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