Получить строку и столбец в Pandas для ячейки с определенным значением - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь прочитать электронную таблицу Excel, которая не отформатирована с помощью Pandas.На одном листе несколько таблиц, и я хочу преобразовать эти таблицы в кадры данных.Поскольку он еще не «проиндексирован» традиционным способом, нет значимых индексов столбцов или строк.Есть ли способ найти определенное значение и получить строку, столбец, где это находится?Например, скажем, я хочу получить строку, номер столбца для всех ячеек, содержащих строку «Заголовок».

Я уже пробовал такие вещи, как DataFrame.filter, но это работает только при наличии индексов строк и столбцов.

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Подобно тому, что сказал Крис, я нашел, что это работает для меня, хотя это не самый красивый или самый короткий путь.Это возвращает все строки, пары столбцов, соответствующие регулярному выражению в кадре данных:

for row in df.itertuples():
    col_count = 0
    for col in row:
        if regex.match(str(col)):
            tuples.append((row_count, col_count))
            col_count+=1
        row_count+=1

return tuples
0 голосов
/ 19 декабря 2018

Вы можете просто создать маску той же формы, что и ваш df, вызвав df == 'title'.Затем вы можете комбинировать это с методом df.where(), который установит все поля в NA, которые отличаются от вашего ключевого слова, и, наконец, вы можете использовать dropna(), чтобы уменьшить его до всех допустимых полей.Тогда вы можете использовать df.columnns и df.index, как вы привыкли.

df = pd.DataFrame({"a": [0,1,2], "b": [0, 9, 7]})
print(df.where(df == 0).dropna().index)
print(df.where(df == 0).dropna().columns)

#Int64Index([0], dtype='int64')
#Index(['a', 'b'], dtype='object')
0 голосов
/ 19 декабря 2018

Вы можете сделать несколько длинных и трудных для чтения списков:

# assume this df and that we are looking for 'abc'
df = pd.DataFrame({'col':['abc', 'def','wert','abc'], 'col2':['asdf', 'abc', 'sdfg', 'def']})

[(df[col][df[col].eq('abc')].index[i], df.columns.get_loc(col)) for col in df.columns for i in range(len(df[col][df[col].eq('abc')].index))]

out:

[(0, 0), (3, 0), (1, 1)]

Я должен отметить, что это (значение индекса, расположение столбца)

вы также можете изменить .eq() на str.contains(), если вы ищете какие-либо строки, содержащие определенное значение:

[(df[col][df[col].str.contains('ab')].index[i], df.columns.get_loc(col)) for col in df.columns for i in range(len(df[col][df[col].str.contains('ab')].index))]
0 голосов
/ 19 декабря 2018

Вот пример для извлечения всех индексов строк и столбцов ячеек, содержащих слово 'title' -

df = pd.DataFrame({'A':['here goes the title', 'tt', 'we have title here'],
                  'B': ['ty', 'title', 'complex']})
df


+---+---------------------+---------+
|   |          A          |    B    |
+---+---------------------+---------+
| 0 | here goes the title | ty      |
| 1 | tt                  | title   |
| 2 | we have title here  | complex |
+---+---------------------+---------+


idx = df.apply(lambda x: x.str.contains('title'))

col_idx = []
for i in range(df.shape[1]):
    col_idx.append(df.iloc[:,i][idx.iloc[:,i]].index.tolist())


out = []
cnt = 0
for i in col_idx:
    for j in range(len(i)):
        out.append((i[j], cnt))
    cnt += 1
out

# [(0, 0), (2, 0), (1, 1)]   # Expected output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...