Подтвердить что ты не робот

Как скопировать/вставить DataFrame из в Python

В вопросах и ответы пользователи часто публикуют пример DataFrame, который их вопрос/ответ работает с:

In []: x
Out[]: 
   bar  foo
0    4    1
1    5    2
2    6    3

Было бы действительно полезно получить этот DataFrame в моем интерпретаторе Python, чтобы я мог начать отлаживать вопрос или тестировать ответ.

Как я могу это сделать?

4b9b3361

Ответ 1

Pandas написано людьми, которые действительно знают, что люди хотят делать.

Начиная с версии 0.13 существует функция pd.read_clipboard, что абсурдно эффективно при создании этой "просто работы".

Скопируйте и вставьте часть кода в вопрос, который запускает bar foo (т.е. DataFrame) и делает это в интерпретаторе Python:

In [53]: import pandas as pd
In [54]: df = pd.read_clipboard()

In [55]: df
Out[55]: 
   bar  foo
0    4    1
1    5    2
2    6    3

Предостережения

  • Не включайте материал iPython In или Out или он не будет работать
  • Если у вас есть именованный индекс, вам нужно добавить engine='python' (см. эту проблему в GitHub). В настоящее время движок 'c' разбит, когда назван указатель.
  • Это не блестяще в MultiIndexes:

Попробуйте следующее:

                      0         1         2
level1 level2                              
foo    a       0.518444  0.239354  0.364764
       b       0.377863  0.912586  0.760612
bar    a       0.086825  0.118280  0.592211

который не работает вообще, или это:

              0         1         2
foo a  0.859630  0.399901  0.052504
    b  0.231838  0.863228  0.017451
bar a  0.422231  0.307960  0.801993

Что работает, но возвращает что-то совершенно неправильное!

Ответ 2

pd.read_clipboard() отличный. Однако, если вы пишете код в сценарии или записной книжке (и вы хотите, чтобы ваш код работал в будущем), это не очень подходит. Вот альтернативный способ скопировать/вставить выходные данные dataframe в новый объект dataframe, который гарантирует, что df переживет содержимое вашего буфера обмена:

import pandas as pd

d = '''0   1   2   3   4
A   Y   N   N   Y
B   N   Y   N   N
C   N   N   N   N
D   Y   Y   N   Y
E   N   Y   Y   Y
F   Y   Y   N   Y
G   Y   N   N   Y'''

df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')

Несколько заметок:

  • Строка в тройных кавычках сохраняет символы новой строки в выходных данных.
  • StringIO оборачивает вывод в read_csv объект, который требуется для read_csv.
  • Установка sep в \s+ делает так, чтобы каждый непрерывный блок пробелов обрабатывался как один разделитель.