Матрица с питоном и пандами

У меня есть файл со связанными данными каждые два столбца (в данном примере это всего 3, но может быть больше) в файле с разделителями табуляции:

Names   SampleA   Names   SampleB   Names   SamplesC
Name1      5      Name3      7      Name1         8
Name2      9      Name2      1      Name2         2
Name4      4      Name4      8      Name3         8

И так далее, что я хочу иметь один столбец с именами столбцов без избыточных данных, и в этом случае 3 столбца с образцами; в тех примерах, которые не являются значениями для имени x, будут соответствовать 0:

Names     SampleA     SampleB    SampleC
Name1          5          0        8
Name2         9           1        2
Name3         0           7        8
Name4         4           8         0

Как я могу приблизиться к этой матрице с пандами ??? будь проще с питоном используя панд !!!

Большое спасибо !!!!

0
задан 4 June 2019 в 08:05

1 ответ

Вы можете сделать это следующим образом:

  1. Сделать имена столбцов однозначными, чтобы у вас не было столбцов с одинаковыми именами (возможно, вы можете избежать этого шага, если хотите, если Вы получаете доступ к столбцам по индексу, но я бы сделал их однозначными): сделайте что-то вроде:

    your_df.columns = ['NamesA', 'SampleA', 'NamesB', 'SampleB', 'Names', 'SamplesC']

  2. Создание фреймов данных из пар столбцов

  3. Объединение фреймов данных с частями столбцов и свертывание столбцов «Имена» в один столбец.

  4. Заполните значения na

Тестовые данные:

import pandas as pd
your_df= pd.DataFrame({
        'NamesA': ['Name1', 'Name2', 'Name4'], 
        'SampleA': [5, 9, 4], 
        'NamesB':['Name3', 'Name2', 'Name4'], 
        'SampleB': [5, 9, 4], 
        'NamesC':['Name1', 'Name2', 'Name3'], 
        'SampleC': [8, 2, 8]
        })

Вот пример кода (начиная с шага 2):

all_cols= list(your_df.columns)
joined_df= None
while all_cols:
    name_col, sample_col, *all_cols= all_cols
    # in case not all columns in your df are filled
    # you need to handle na values
    filled_indexer= ~your_df[name_col].isna()
    # Step 2:
    col_pair_df= your_df.loc[filled_indexer, [name_col, sample_col]]
    # Step 3:
    if joined_df is None:
        joined_df= col_pair_df
        joined_df.columns= ['Names', sample_col]
    else:
        joined_df= joined_df.merge(col_pair_df, how='outer', left_on='Names', right_on=name_col)
        # now we need to populate the one names column and remove the Names* columns
        names_na_indexer= joined_df['Names'].isna()
        joined_df.loc[names_na_indexer, 'Names']= joined_df[name_col]
        joined_df.drop(name_col, axis='columns', inplace=True)
# Step 4:
joined_df.fillna(0, inplace=True)
0
ответ дан 4 June 2019 в 08:05

Другие вопросы по тегам:

Похожие вопросы: