#python #pandas #numpy #dataframe
#python #pandas #numpy #фрейм данных
Вопрос:
Итак, у меня есть эта функция prep_dat, и я предоставляю ей следующие данные csv:
identifier,Hugo_Symbol,Tumor_Sample_Barcode,Variant_Classification,patient
1,patient,a,Silent,6
22,mutated,d,e,7
1,Hugo_Symbol,f,g,88
в этой функции prep_data есть эта строка
gene_mutation_df.index.set_names(['Hugo_Symbol', 'patient'], inplace=True)
Однако он продолжает ошибаться, когда доходит до строки, в которой говорится
ValueError: Length of new names must be 1, got 2
Что-то не так со строкой или что-то не так с функцией
Вот весь исходный код
import pandas as pd
import numpy as np
PRIMARY_TUMOR_PATIENT_ID_REGEX = '^.{4}-.{2}-.{4}-01.*'
SHORTEN_PATIENT_REGEX = '^(.{4}-.{2}-.{4}).*'
def mutations_for_gene(df):
mutated_patients = df['identifier'].unique()
return pd.DataFrame({'mutated': np.ones(len(mutated_patients))}, index=mutated_patients)
def prep_data(mutation_path):
df = pd.read_csv(mutation_path, low_memory=True, dtype=str, header = 0)#Line 24 reads in a line memory csv file from the given path and parses it based on 't' delimators, and casts the data to str
df = df[~df['Hugo_Symbol'].str.contains('Hugo_Symbol')] #analyzes the 'Hugo_Symbol' heading within the data and makes a new dataframe where any row that contains 'Hugo_Symbol' is dropped
df['Hugo_Symbol'] = ''' df['Hugo_Symbol'].astype(str) # Appends '''' to all the data remaining in that column
df['Tumor_Sample_Barcode'] = df['Tumor_Sample_Barcode'].str.strip() #strips away whitespace from the data within this heading
non_silent = df.where(df['Variant_Classification'] != 'Silent') #creates a new dataframe where the data within the column 'Variant_Classification' is not equal to 'Silent'
df = non_silent.dropna(subset=['Variant_Classification']) #Drops all the rows that are missing at least one element
non_01_barcodes = df[~df['Tumor_Sample_Barcode'].str.contains(PRIMARY_TUMOR_PATIENT_ID_REGEX)]['Tumor_Sample_Barcode'] #Creates a new dataframe of all the data within the 'Tumor_Sample_Barcode' column that does not match the PRIMARY_TUMOR_PATIENT_ID_REGEX
#TODO: Double check that the extra ['Tumor_Sample_Barcode'] serves no purpose
df = df.drop(non_01_barcodes.index)
print(df)
shortened_patients = df['Tumor_Sample_Barcode'].str.extract(SHORTEN_PATIENT_REGEX, expand=False)
df['identifier'] = shortened_patients
gene_mutation_df = df.groupby(['Hugo_Symbol']).apply(mutations_for_gene)
gene_mutation_df.index.set_names(['Hugo_Symbol', 'patient'], inplace=True)
gene_mutation_df = gene_mutation_df.reset_index()
gene_patient_mutations = gene_mutation_df.pivot(index='Hugo_Symbol', columns='patient', values='mutated')
return gene_patient_mutations.transpose().fillna(0)
Любая помощь была бы с благодарностью принята (я знаю, что это не было конкретным, я все еще пытаюсь понять, что именно делает эта функция и как я мог бы создать данные для ее тестирования)
Комментарии:
1.
gene_mutation_df.index.set_name
используется для задания имен для уже существующего индекса. У вас есть только 1 индекс (я имею в виду не мультииндекс), вместо этого вы можете захотеть использоватьgene_mutation_df.set_index(['Hugo_Symbol', 'patient'], inplace=True)
2. Но я уже использую это
3. Я не мог видеть этого в вашем коде, также, если вы
set_index
столбцы, вам, возможно, не придется снова устанавливать имена индексов, если вы не хотите переименовать индекс4. Вот что говорит мой код: gene_mutation_df.index.set_names([‘Hugo_Symbol’, ‘patient’], inplace = True) Не могли бы вы привести пример set_index, пожалуйста?
5. Я уже дал вам код, на
set_index()
который вы должны заменитьgene_mutation_df.index.set_name
, вы пробовали это ? 🙂