Импорт файла, содержащего текстовые и числовые данные, используя Python - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть файл .txt , который содержит текстовые данные и числовые данные.Первые две строки файла содержат важную информацию в виде текстовых данных, в то время как первый столбец (я имею в виду нулевой столбец как первый столбец) также содержит важные данные в текстовой форме.Во всех других местах в файле данные представлены в числовой форме.Я хочу проанализировать числовые данные, присутствующие в файле, используя библиотеки на python, предпочтительно numpy или pandas, или их комбинацию (анализ, такой как регрессия, корреляция, scikit-learn и т. Д.).Я повторяю, что все данные в файле необходимы для моего анализа.Следующий снимок (взят из Excel) показывает усеченную версию формата, в котором находятся мои данные: enter image description here

Данные, показанные в этом снимке, можно найти здесь.

В частности, я хочу иметь возможность импортировать все числовые данные из этого файла, используя python (numpy или pandas), и иметь возможность ссылаться на определенные строки в этих данных, используятекстовые данные в первых двух строках (тип, тег) и в первом столбце (номер объекта).В моем собственном файле данных у меня есть сотни тысяч строк (типов объектов) и множество столбцов.

Я уже пытался использовать numpy.loadtxt(...) и pandas.read_csv(...), чтобы открыть этот файл, но я либо столкнулся с ошибками, либо загрузил данные в неуклюжих форматах.Я буду очень благодарен, если у меня будет какое-то руководство относительно того, как я могу импортировать файл в python таким образом, чтобы у меня была та функциональность, которая мне нужна.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Используйте sep с \s для любых пробелов, не только табуляции, engine='python' для удаления предупреждения:

df=pd.read_csv('dum.txt',engine='python',sep='\s')
print(df)

Вывод:

      Type    T1    T2    T3    T4    T5
0      Tag  Good  Good  Good  Good  Good
1  object1   1.1   2.1   3.1   4.1   5.1
2  object2   1.2   2.2   3.2   4.2   5.2
3  object3   1.3   2.3   3.3   4.3   5.3
4  object4   1.4   2.4   3.4   4.4   5.4
5  object5   1.5   2.5   3.5   4.5   5.5
6  object6   1.6   2.6   3.6   4.6   5.6
7  object7   1.7   2.7   3.7   4.7   5.7
8  object8   1.8   2.8   3.8   4.8   5.8

Или, если хотите две строкистолбцов (я не рекомендовал бы, потому что тогда это трудно использовать):

df=pd.read_csv('dum.txt',engine='python',sep='\s',header=[0,1])
print(df)

Вывод:

      Type   T1   T2   T3   T4   T5
       Tag Good Good Good Good Good
0  object1  1.1  2.1  3.1  4.1  5.1
1  object2  1.2  2.2  3.2  4.2  5.2
2  object3  1.3  2.3  3.3  4.3  5.3
3  object4  1.4  2.4  3.4  4.4  5.4
4  object5  1.5  2.5  3.5  4.5  5.5
5  object6  1.6  2.6  3.6  4.6  5.6
6  object7  1.7  2.7  3.7  4.7  5.7

В противном случае прямое прямое read_csv (например, pd.read_csv('dum.txt')) вернет:

            Type\tT1\tT2\tT3\tT4\tT5
0  Tag\tGood\tGood\tGood\tGood\tGood
1   object1\t1.1\t2.1\t3.1\t4.1\t5.1
2   object2\t1.2\t2.2\t3.2\t4.2\t5.2
3   object3\t1.3\t2.3\t3.3\t4.3\t5.3
4   object4\t1.4\t2.4\t3.4\t4.4\t5.4
5   object5\t1.5\t2.5\t3.5\t4.5\t5.5
6   object6\t1.6\t2.6\t3.6\t4.6\t5.6
7   object7\t1.7\t2.7\t3.7\t4.7\t5.7
8   object8\t1.8\t2.8\t3.8\t4.8\t5.8
0 голосов
/ 26 сентября 2018

На вашем месте я бы использовал pandas и импортировал бы его, используя что-то вроде этого:

df = pd.read_csv('dum.txt',sep='\t', header=[0,1], index_col=0)

Это дает вам фрейм данных:

>>> df
Type      T1   T2   T3   T4   T5
Tag     Good Good Good Good Good
object1  1.1  2.1  3.1  4.1  5.1
object2  1.2  2.2  3.2  4.2  5.2
object3  1.3  2.3  3.3  4.3  5.3
object4  1.4  2.4  3.4  4.4  5.4
object5  1.5  2.5  3.5  4.5  5.5
object6  1.6  2.6  3.6  4.6  5.6
object7  1.7  2.7  3.7  4.7  5.7
object8  1.8  2.8  3.8  4.8  5.8

И всеваши столбцы с плавающей точкой:

>>> df.dtypes
Type  Tag 
T1    Good    float64
T2    Good    float64
T3    Good    float64
T4    Good    float64
T5    Good    float64
dtype: object

Содержит многоиндексный заголовок столбца:

>>> df.columns
MultiIndex(levels=[['T1', 'T2', 'T3', 'T4', 'T5'], ['Good']],
           labels=[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]],
           names=['Type', 'Tag'])

И обычный индекс, содержащий информацию из Type:

>>> df.index
Index(['object1', 'object2', 'object3', 'object4', 'object5', 'object6',
       'object7', 'object8'],
      dtype='object')

Кроме того, вы можете преобразовать свои значения в numpy массив floats, просто используя:

>>> df.values
array([[1.1, 2.1, 3.1, 4.1, 5.1],
       [1.2, 2.2, 3.2, 4.2, 5.2],
       [1.3, 2.3, 3.3, 4.3, 5.3],
       [1.4, 2.4, 3.4, 4.4, 5.4],
       [1.5, 2.5, 3.5, 4.5, 5.5],
       [1.6, 2.6, 3.6, 4.6, 5.6],
       [1.7, 2.7, 3.7, 4.7, 5.7],
       [1.8, 2.8, 3.8, 4.8, 5.8]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...