#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)
Комментарии:
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