Как выбрать и упорядочить столбцы в кадре данных, используя массив в Python - PullRequest
0 голосов
/ 03 октября 2018

У меня довольно большой фрейм данных, df2 (~ 50 000 строк x 2000 столбцов).Заголовки столбцов являются примерами имен.Отдельно у меня есть фрейм данных df1 со списком выборок, которые я хочу включить в свой анализ в качестве индекса df1.Я хочу использовать список образцов из индекса df1, чтобы выбрать только столбцы из df2 для этих выбранных образцов, отбрасывая остальные.Я также хочу сохранить порядок сэмплов из индекса df1.

Пример данных:

# df1
data1 = {'Sample': ['Sample_A','Sample_D', 'Sample_E'], 
        'Location': ['Bangladesh', 'Myanmar', 'Thailand'],
        'Year':[2012, 2014, 2015]}
df1 = pd.DataFrame(data1)
df1.set_index('Sample')

# df2
data2 = {'Num': ['Value_1','Value_2','Value_3','Value_4','Value_5'], 
        'Sample_A': [0,1,0,0,1],
        'Sample_B':[0,0,1,0,0],
        'Sample_C':[1,0,0,0,1],
        'Sample_D':[0,0,1,1,0]}
df2 = pd.DataFrame(data2)
df2.set_index('Num')

Сначала я сгенерирую список сэмплов, которые мне нужны, по индексу df1, например

samples = df1['Sample'].tolist()

то есть «samples», то

['Sample_A', 'Sample_D', 'Sample_E']

И, используя «samples», мой желаемый выходной кадр данных, df3, должен выглядеть следующим образом:

index  Sample_A  Sample_D
Value_1  0  0
Value_2  1  0
Value_3  0  1
Value_4  0  1
Value_5  1  0

Но если яиспользуйте

df3 = df2[samples]

Затем я получаю сообщение об ошибке:

"['Sample_E'] not in index"

Так как мне игнорировать сэмплы, которые не найдены в df2, чтобы избежать этого сообщения об ошибке?

ОБНОВЛЕНИЕ Решение, которое работало -

# 1. Define samples to use from df1
samples = df1['Sample'].tolist()
# Only include samples that are found in df2 as well
final_samples = list(set(list(df2.columns)) & set(samples ))
# Make new df with columns corresponding to final_samples
df3 = df2.loc[:, final_samples]

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

попробуйте вот так ..

df = pd.read_csv("data.csv", usecols=['Sample_A','Sample_D']).fillna('')
print(df)

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

>>> df.loc[:, ['Sample_A','Sample_D']]

Ваш ответ из предоставленного вами набора данных:

>>> data2 = {'Num': ['Value_1','Value_2','Value_3','Value_4','Value_5'],
...         'Sample_A': [0,1,0,0,1],
...         'Sample_B':[0,0,1,0,0],
...         'Sample_C':[1,0,0,0,1],
...         'Sample_D':[0,0,1,1,0]}
>>> df2 = pd.DataFrame(data2)
>>> df2.set_index('Num').loc[:, ['Sample_A','Sample_D']]
         Sample_A  Sample_D
Num
Value_1         0         0
Value_2         1         0
Value_3         0         1
Value_4         0         1
Value_5         1         0

==========================================

>>> df3 = df2.loc[:, samples]
>>> df3
   Sample_A  Sample_D  Sample_E
0         0         0       NaN
1         1         0       NaN
2         0         1       NaN
3         0         1       NaN
4         1         0       NaN

ИЛИ

>>> df3 = df2.reindex(columns=samples)
>>> df3
   Sample_A  Sample_D  Sample_E
0         0         0       NaN
1         1         0       NaN
2         0         1       NaN
3         0         1       NaN
4         1         0       NaN
0 голосов
/ 03 октября 2018

Вы можете сделать это таким образом.Массив этих столбцов находится в том порядке, который вам действительно нужен.

import pandas as pd

data = {'index': ['Value_1','Value_2','Value_3','Value_4','Value_5'], 
        'Sample_A': [0,1,0,0,1],
        'Sample_B':[0,0,1,0,0],
        'Sample_C':[1,0,0,0,1],
        'Sample_D':[0,0,1,1,0]}
df = pd.DataFrame(data)
df.set_index('index')
df1 = df[['index']+['Sample_A','Sample_D']]

output:

     index  Sample_A  Sample_D
0  Value_1         0         0
1  Value_2         1         0
2  Value_3         0         1
3  Value_4         0         1
4  Value_5         1         0

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

samples = ['index', 'Sample_A', 'Sample_D','Extra_Sample']
final_samples = list(set(list(df1.columns)) & set(samples ))

Теперь вы можете передать final_samples, в котором есть только столбцы df2.

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