Как сравнить строковое значение в столбце dataframe и значение в ячейке, чтобы создать новый dataframe на основе словаря с несколькими значениями? - PullRequest
0 голосов
/ 08 января 2019

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

id.1.value.1        id.2.value.2      id.1.question    id.2.value.2
TRUE                     FALSE             TRUE             TRUE

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

  1. Если значение в столбце value равно TRUE, сравните последнее число в словаре с несколькими значениями

  2. использовать второе значение в многоключевом словаре для создания имен столбцов данных

Пример:

my_dict = {1: ('a', 'category'),2: ('b', 'category'),\
           3: ('c', 'category'),4:('d','category'),\
           5:('e','subcategory'),6:('f','subcategory'),\
           7:('g','subcategory'),8:('h','subcategory'),\
           9:('i','subcategory'),10:('j','subcategory'),\
           11:('k','subcategor'),12:('l','subcategory'),\
           13:('m','subcategory'),14:('n','subcategory'),\
           15:('o','subcategory'),16:('p','subcategory'),\
           17:('q','subcategory'),18:('r','subcategory'),\
           19:('s','subcategory'),20:('t','subcategory'),\
           21:('u','subcategory'),22:('v','subcategory'),\
           23:('w','subcategory'),24:('x','subcategory')

           }

Если мой текущий df выглядит так:

id.1.value.1        id.2.value.2      id.1.question    id.6.value.6
    TRUE                 FALSE             TRUE             TRUE

Новый df должен выглядеть так:

category    subcategory
a               f

Ответы [ 4 ]

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

IIUC:

ans = [my_dict[int(x[-1])] for x in df1.where(df1.loc[:,['value' in x for x in df1.columns]]).dropna(axis=1)]
pd.DataFrame.from_dict({v: k for k, v in dict(ans).items()}, orient='index').T

Выход:

  category subcategory
0        a           f
0 голосов
/ 08 января 2019
names = df.columns
new_df = pd.DataFrame()
for name in names:    
    if ('value' in name) & df[name][0]:
        last_number = int(name[-1])
        key, value = my_dict[last_number]
        try:
            new_df[value][0] = list(new_df[value][0]) + [key]
        except:
            new_df[value] = [key]      
0 голосов
/ 08 января 2019
new_df = pd.DataFrame()

# get column names
for col in (list(df)):

    if "value" in col:

        try:
            # operate only in columns where a valid number is found
            value = df[col].rpartition('.')[:-1]

            # When df== True
            if df.loc[col,1]==True:
                new_df[my_dict[value][1]]= my_dict[value][0]
        except Exception as e:
            print(e)
0 голосов
/ 08 января 2019

где дф,

   id.1.value.1  id.2.value.2  id.1.question  id.6.value.6
0          True         False           True          True

Использование:

i = df.loc[:,df.columns[df.iloc[0]]].filter(like='value').columns.str.split('.').str[-1].astype(int).tolist()

my_dict = {1: ('a', 'category'),2: ('b', 'category'),\
           3: ('c', 'category'),4:('d','category'),\
           5:('e','subcategory'),6:('f','subcategory'),\
           7:('g','subcategory'),8:('h','subcategory'),\
           9:('i','subcategory'),10:('j','subcategory'),\
           11:('k','subcategor'),12:('l','subcategory'),\
           13:('m','subcategory'),14:('n','subcategory'),\
           15:('o','subcategory'),16:('p','subcategory'),\
           17:('q','subcategory'),18:('r','subcategory'),\
           19:('s','subcategory'),20:('t','subcategory'),\
           21:('u','subcategory'),22:('v','subcategory'),\
           23:('w','subcategory'),24:('x','subcategory')}

df1 = pd.DataFrame.from_dict(my_dict, orient='index')

df_out = df1.loc[i].set_index(1).T

print(df_out)

Выход:

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