У меня есть сценарий, который генерирует DataFrames с 1 строкой и 50 столбцами. Каждая ячейка каждого DataFrame содержит строку. Однако, за исключением одной ячейки, все эти строки не содержат элементов, поэтому они выглядят так: ''
. В результате каждый DataFrame выглядит примерно так:
Col 1 Col 2 ... Col 49 Col 50
0 "Here it is."
Только одна из ячеек может содержать полное предложение (то есть в столбце 49 в этом случае), но неизвестно, что такое предложение и в каком столбце он находится. И я хочу вернуть только это предложение. Что такое простой способ сделать это?
Если вы используете серию вместо этого, легко фильтровать одну ячейку с непустым элементом:
import pandas as pd
df = pd.DataFrame({'col1': [""], 'col2': [""], 'col3': [""], 'col4': ["some words"], 'col5': [""]})
s = df.T[0]
sentence = s[s != ""]
Это переносит блок данных, а затем преобразует его в серию. Это, конечно, проще и быстрее, если вы можете хранить данные в серии в первую очередь.
Или, как указывает RafaelC в комментарии: избегайте хранить все пустые строки в первую очередь и храните непустую строку непосредственно в вашей переменной, полностью пропуская фрейм данных.
Используйте тот факт, что пустые строки ложны
df.at[0, df.loc[0].astype(bool).idxmax()]
Вот одно решение. Учитывая этот сценарий
import pandas as pd
row = ['' for i in range(50)]
row[34] = 'Raining somewhere'
pdf = pd.DataFrame([row])
который выглядит
In [5]: print(pdf)
0 1 2 3 4 5 6 7 8 9 ... 40 41 42 43 44 45 46 47 48 49
0 ...
[1 rows x 50 columns]
Мы можем получить кадр данных, который содержит столбцы с записями, которые не являются ''
с
pdf[pdf !=''].dropna(axis = 1)
который возвращается
34
0 Raining somewhere
Если вы просто хотите, чтобы строка
pdf[pdf !=''].dropna(axis = 1).values[0][0]
возвращается
'Raining somewhere'
Это предполагает, что в кадре данных есть только одна такая строка. Если вы не хотите использовать pdf != ''
Вы всегда можете использовать
import numpy as np
pdf.replace('',np.nan).dropna(axis = 1).values[0][0]