Панды выбирают имя столбца на основе информации о строке - PullRequest
0 голосов
/ 25 октября 2018

Я использую Pandas и Python 3.5.1.

. Предположим, имеется следующий фрейм данных с именем df:

    name1  name2  name3  name4
0     1      2      3      4
1     5      6      7      8
2     4      9      6      2
3     5      1      7      3

. Обратите внимание, что все значения в каждой строке уникальны., ни один столбец не имеет такого же значения, как и другой, построчно.

Скажем, у меня в прицеле есть число, например 7 из df[name3][1].Есть ли способ получить только заголовок столбца name3, основанный на строке (1) и значении (7)?

Я не хочу ничего в самом столбце, например 3, 7, 6, or 7.Мне нужен только заголовок столбца.

Ответы [ 3 ]

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

Вы можете использовать map метод, чтобы получить то, что вы хотите.Например:

maps = [[],[(0,'name1'),(3,'name2')],[(0,'name2'),(2,'name4')],... ]

Когда вы выберете 1 from df[name1][0], вы найдете maps[1] = [(0,'name1'),(3,'name2')] И вы можете получить имя col, где row = 0 равно name1

Весь код подобен этому:

maps = [(),() ..... ]
for col in data.columns:
    for row in range(len(data)):
        value = data[col][row]
        maps[value] = (row,col)
0 голосов
/ 25 октября 2018

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

lookup = 14
row = 1
next((k for k,v in df.iloc[row,:].items() if v == lookup), 'No match')
0 голосов
/ 25 октября 2018

Общее решение - работает, если не совпадает row или val:

val = 70
row = 10

val = df.reindex(index=[row]).eq(val).squeeze()
col = next(iter(val.index[val]), 'no match')
print (col)
no match

Другое общее решение:

def get_col(row, val):
    try:
        a = df.loc[row].eq(val)
        c = a.index[a][0]
    except KeyError:
        c = 'not matched row'
    except IndexError:
        c = 'not matched value'
    return c

print (get_col(1, 7))
name3
print (get_col(10, 7))
not matched row
print (get_col(1, 70))
not matched value
print (get_col(10, 70))
not matched row

Решение, если всегда существует val и значения строки в DataFrame, потому что если не существует и все False возвращаются из df.loc[row].eq(val), то idxmax возвращает первое False - имя первого столбца.

val = 7
row = 1
col = df.loc[row].eq(val).idxmax()
#if want seelct by pocition use iloc
#col = df.iloc[row].eq(val).idxmax()
print (col)
name3

Объяснение :

Сначала выберите строку по DataFrame.loc:

print (df.loc[row])
name1    5
name2    6
name3    7
name4    8
Name: 1, dtype: int64

Затем сравните по eq

print (df.loc[row].eq(val))
name1    False
name2    False
name3     True
name4    False
Name: 1, dtype: bool

И последний получить значение индекса первого True на idxmax:

print (df.loc[row].eq(val).idxmax())
name3
...