web-dev-qa-db-ja.com

スタックオーバーフローからDataFrameをPythonにコピー/貼り付ける方法

questions および answers では、ユーザーが質問/回答が機能する例DataFrameを投稿することがよくあります。

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

このDataFrameを私のPythonインタープリターに取り込むことができるようにすると、質問のデバッグや回答のテストを開始できるので、本当に役に立ちます。

これどうやってするの?

45
LondonRob

パンダは、人々が何をしたいかを本当に知っている人々によって書かれています。

バージョン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

これは機能しますが、完全に正しくないものを返します!

52
LondonRob

pd.read_clipboard()は気の利いたものです。ただし、スクリプトまたはノートブックでコードを記述している場合(および将来的にコードを機能させたい場合)は、あまり適していません。以下は、データフレームの出力を新しいデータフレームオブジェクトにコピー/貼り付けして、dfがクリップボードのコンテンツよりも長く存続するようにする別の方法です。

# py3 only, see below for py2
import pandas as pd
from io import StringIO

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(StringIO(d), sep='\s+')

いくつかのメモ:

  • 三重引用符で囲まれた文字列は、出力の改行を保持します。
  • StringIOは、read_csvに必要なファイルのようなオブジェクトに出力をラップします。
  • sep\s+に設定すると、空白の連続する各ブロックが単一の区切り文字として扱われるようになります。

更新

上記の答えはPython 3のみです。Python 2で行き詰まっている場合は、インポート行を置き換えてください。

from io import StringIO

代わりに:

from StringIO import StringIO

古いバージョンのpandasv0.24以前)を使用している場合は、上記のコードのPy2/Py3互換バージョンを簡単に作成できます。

import pandas as pd

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

pandasの最新バージョンは、Python 2のサポートとともにcompatモジュールを削除しました。

9
tel

次のような標準のエントリがあるCSVファイルからコピーして貼り付ける場合:

2016,10,M,0600,0610,13,1020,24
2016,3,F,0300,0330,21,6312,1
2015,4,M,0800,0830,8,7112,30
2015,10,M,0800,0810,19,0125,1
2016,8,M,1500,1510,21,0910,2
2015,10,F,0800,0810,3,8413,5

df =pd.read_clipboard(sep=",", header=None)
df.rename(columns={0: "Name0", 1: "Name1",2:"Name2",3:"Name3",4:"Name4",5:"Name5",6:"Name6",7:"Name7",8:"Name8"})

適切に定義されたpandas Dataframe。

enter image description here

0
Harvey