Генерация всех комбинаций из 7 столбцов в кадре данных и добавление соответствующих строк для создания новых столбцов - PullRequest
0 голосов
/ 10 января 2019

У меня есть датафрейм, который выглядит примерно так:

Wave    A    B   C
340    77   70  15
341    80   73  15
342    83   76  16
343    86   78  17

Я хочу создать столбцы, которые будут содержать все возможные комбинации существующих столбцов. Я показал 3 столбца, но в моих реальных данных у меня есть 7 столбцов и, следовательно, 127 комбинаций. Желаемый вывод выглядит следующим образом:

Wave    A    B   C   AB   AC   AD   BC ... ABC
340    77   70  15   147  92   ...
341    80   73  15   153  95   ... 
342    83   76  16   159  99   ...

Я реализовал довольно неэффективную версию, в которой пользователь вводит комбинации (AB, AC и т. Д.), И создается новый столбец с суммой строк. Это кажется почти невозможным для 127 комбинаций, особенно с описательными именами col.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Создайте список всех комбинаций с chain + combinations из itertools, затем сложите соответствующие столбцы:

from itertools import combinations, chain

cols = [*df.iloc[:,1:]]
l = list(chain.from_iterable(combinations(cols, n+2) for n in range(len(cols))))
#[('A', 'B'), ('A', 'C'), ('B', 'C'), ('A', 'B', 'C')]

for items in l:
    df[''.join(items)] = df.loc[:, items].sum(1)

   Wave   A   B   C   AB   AC  BC  ABC
0   340  77  70  15  147   92  85  162
1   341  80  73  15  153   95  88  168
2   342  83  76  16  159   99  92  175
3   343  86  78  17  164  103  95  181
0 голосов
/ 10 января 2019

Сначала нужно получить все combination, затем мы просто получим combination, и нам нужно создать карты dict или Series

l=df.columns[1:].tolist()

l1=[list(map(list, itertools.combinations(l, i))) for i in range(len(l) + 1)]

d=[dict.fromkeys(y,''.join(y))for x in l1 for y in x ]

maps=pd.Series(d).apply(pd.Series).stack()
df.set_index('Wave',inplace=True)
df=df.reindex(columns=maps.index.get_level_values(1))
#here using reindex , get the order of your new df to the maps keys
df.columns=maps.tolist()
# here assign the new value to the column , since the order is same that why here I am assign it back 
df.sum(level=0,axis=1)

Out[303]: 
       A   B   C   AB   AC  BC  ABC
Wave                               
340   77  70  15  147   92  85  162
341   80  73  15  153   95  88  168
342   83  76  16  159   99  92  175
343   86  78  17  164  103  95  181
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...