У меня есть файл со связанными данными каждые два столбца (в данном примере это всего 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
Как я могу приблизиться к этой матрице с пандами ??? будь проще с питоном используя панд !!!
Большое спасибо !!!!
Вы можете сделать это следующим образом:
Сделать имена столбцов однозначными, чтобы у вас не было столбцов с одинаковыми именами (возможно, вы можете избежать этого шага, если хотите, если Вы получаете доступ к столбцам по индексу, но я бы сделал их однозначными): сделайте что-то вроде:
your_df.columns = ['NamesA', 'SampleA', 'NamesB', 'SampleB', 'Names', 'SamplesC']
Создание фреймов данных из пар столбцов
Объединение фреймов данных с частями столбцов и свертывание столбцов «Имена» в один столбец.
Заполните значения 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)