Извлечение значений из переменной DataFrame

#python #pandas #dataframe #parsing #indexing

#python #панды #dataframe #синтаксический анализ #индексирование

Вопрос:

Я пытаюсь извлечь данные из переменной DataFrame (переменной в терминах числа строк и столбцов, а также заголовков строк / столбцов), однако мне нужно отфильтровать только те конкретные значения, которые меня интересуют, то есть ячейки, которые не равны нулю.

Для всех ячеек, которые не равны нулю, мне нужно извлечь ссылку Des (заголовок строки), номер напряжения (заголовок столбца) и значение ячейки; затем экспортировать эти значения в текстовый файл.

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

 df = pd.read_excel(ExcelFilename, sheet_name='Sheet1', sep='delimiter', header=5, index_col(0))
df.fillna('', inplace=true)
  

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

Комментарии:

1. Пожалуйста, отправьте запрошенный результат

Ответ №1:

IIUC, хитрость здесь будет заключаться в том, чтобы установить ваш столбец «ref» в качестве индекса. Затем используйте np.where для извлечения местоположений, где происходят ненулевые значения. После того, как у вас есть местоположения, вы можете извлечь их соответствующие значения индекса / столбца с помощью простой индексации. Затем для получения значений вы можете использовать DataFrame.lookup метод.

 import pandas as pd
import numpy as np

df = pd.DataFrame({
    "ref": ["U{}".format(i) for i in range(11)],
    "random": np.random.rand(11),
    "voltage1": np.random.choice([0, 1, 2], size=11, p=[.8, .1, .1]),
    "voltage2": np.random.choice([0, 1, 2], size=11, p=[.8, .1, .1]),
    "voltage3": np.random.choice([0, 1, 2], size=11, p=[.8, .1, .1]),
    "voltage4": np.random.choice([0, 1, 2], size=11, p=[.8, .1, .1]),
})

df = df.set_index("ref")

print(df)
       random  voltage1  voltage2  voltage3  voltage4
ref                                                  
U0   0.592230         0         0         0         0
U1   0.896761         0         0         0         0
U2   0.406733         0         0         0         0
U3   0.552078         2         0         2         0
U4   0.271653         1         0         0         2
U5   0.455444         0         0         0         0
U6   0.401714         0         1         0         0
U7   0.248413         0         0         0         0
U8   0.505866         0         0         0         0
U9   0.310381         0         0         0         2
U10  0.373035         0         0         0         0
  

Теперь мы фильтруем, чтобы включать только столбцы, в которых есть «напряжение». Из этого мы извлекаем целочисленные позиции всех ненулевых элементов. Мы можем использовать эти целочисленные позиции для извлечения значений индекса / столбца dataframe, и, наконец, мы также можем извлечь эти соответствующие значения и поместить их все в один конечный результат.

 voltages_only = df.filter(like="voltage")
locations = np.where(voltages_only != 0)

indices = voltages_only.index[locations[0]]
columns = voltages_only.columns[locations[1]]
values = voltages_only.lookup(indices, columns)

out = pd.DataFrame({
    "ref": indices,
    "voltage": columns,
    "value": values,
})

print(out)
  ref   voltage  value
0  U3  voltage1      2
1  U3  voltage3      2
2  U4  voltage1      1
3  U4  voltage4      2
4  U6  voltage2      1
5  U9  voltage4      2