Создание подмножеств строк и соответствующих столбцов в кадре данных - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть кадр данных, как в примере ниже, и я хочу создать несколько копий строк в соответствии с количеством B1-B4. Более того, по очереди заполняйте алфавит в новых соответствующих столбцах.

необработанный кадр данных:

       B1   B2   B3  B4
 0     1C 
 1     3A   1A
 2    41A  28A   3A 
 3    42A  41A  28A  3A


Целевой выход:

       B1   B2   B3  B4  B1_u  B2_u  B3_u  B4_u
 0     1C                   C

Пояснение:
row 0: имеет только 1 значение в B1, поэтому в соответствующем столбце есть только один выход (C из 1C) B1_u

       B1   B2   B3  B4  B1_u  B2_u  B3_u  B4_u
 1     3A   1A              A     
 2     3A   1A                    A

Пояснение:
row 1: вот значение 2 (3A, 1A), поэтому расширьте 2 строки и заполните (A из 3A & 1A) соответствующие столбцы B1_u, B2_u на витки

и т. Д.

       B1   B2   B3  B4  B1_u  B2_u  B3_u  B4_u
 3    41A  28A   3A         A    
 4    41A  28A   3A               A     
 5    41A  28A   3A                     A

       B1   B2   B3  B4  B1_u  B2_u  B3_u  B4_u
 6    42A  41A  28A  3A     A          
 7    42A  41A  28A  3A           A    
 8    42A  41A  28A  3A                 A   
 9    42A  41A  28A  3A                       A

1 Ответ

0 голосов
/ 06 ноября 2018

IIUC: Вот решение:

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

import pandas as pd
import numpy as np
import string
#Code to generate data-set - not explained
df = pd.DataFrame(np.tril(np.random.randint(1, 100, (10,10))), columns=[f'B{x}' for x in range(1, 11)])
df = df.applymap(str)
df = df.replace('0', '')
pp = np.random.dirichlet(np.ones(26)*1000., size=1)[0]
cl = np.random.choice(list(string.ascii_uppercase), size=(10), p=pp)
for x in range(0, len(df)):
    for y in range(0, x + 1):
        df.iloc[x, y] = f'{df.iloc[x, y]}{cl[x]}'
#Solution code
#Create a dataframe to store the output from the columns of input dataframe and its index
dfo = pd.DataFrame(columns=[f'{x}_u' for x in df.columns], index=df.index)
#Count non empty values in all the rows
vc = df.apply(lambda x: np.count_nonzero(x), axis=1)
#NOTE: If you have a row that can have more than one attribute then you need to revisit your problem
#Irrespective how the data-set was generated the following code shall work
#Lets populate the output dataframe as required by running nested for loops
for i, v in enumerate(vc):
    for j in range(0, v):
        dfo.iloc[i, j] = list(df.iloc[i, j])[-1]

result = df.join(dfo)

Вот как будет выглядеть вывод:

enter image description here

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