####実行した環境
Ubuntu Stdio 18.04LTS
Python 3.6.5
####参考
How to convert OpenDocument spreadsheets to a pandas DataFrame?
https://stackoverflow.com/questions/17834995/how-to-convert-opendocument-spreadsheets-to-a-pandas-dataframe
pandas.read_excel()と言うExcelを読み込んだり、いろいろ出来る関数があるのを今日知ったのですが、私はUbuntuを使用しているので使えません。残念
それで色々検索していたら、LibreOffice Calcを読み込むパッケージがあると言うことで、インストールしました。
####注意)
上記の参考にも書いてあるように、あくまでも実験の段階で、色々な機能はありません。
ODFスプレッドシート( .odsファイル)のサポートは、 pandas問題追跡ツール: https : //github.com/pydata/pandas/issues/2311で要求されていますが 、まだ実装されていません。
ezodfは未完成のPR9070で、パンダでODFサポートを実装するために使用されました。 そのPRは現在閉鎖されています(技術的な話し合いのためにPRを読んでください)が、 この pandasフォークの実験的な機能としてまだ利用可能です。
XMLコード( ここでは )から直接読み込むいくつかの強引な方法もあります
header 、 skiprows 、 index_col 、 parse_colsような他の有用なパラメータはこの関数では実装されていません。実装したい場合はこの質問を更新してください
####インストール
(Ubuntu Studio 18.04の場合)
$ pip3 search pandas //検索
pandas (0.23.4) - Powerful data structures for data
analysis, time series, and statistics
$ pip3 search ezodf
ezodf (0.3.2) - A Python package to create/manipulate
OpenDocumentFormat files.
$ pip3 install pandas //インストール
$ pip3 install ezodf
#!/usr/bin/python3
# coding: UTF-8
import pandas as pd
import ezodf
def read_ods(filename, sheet_no=0, header=0):
tab = ezodf.opendoc(filename=filename).sheets[sheet_no]
return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] for col in tab.columns()})
df = read_ods(filename='fn.ods')
print(df)
####使い物になるか?
<class 'pandas.core.frame.DataFrame'>
typeで調べるとpandas DataFrame??
まったく知識がないので、ネットのサイトを参考にして行います。
RemrinのPython攻略日記さんのサイトを参考にします。
http://python-remrin.hatenadiary.jp/entry/2017/05/08/212120
*データフレームを作る(2)リストから
import numpy as np
import pandas as pd
d =[[1, 2, 3],
[50, 60, 70]]
frame = pd.DataFrame(d)
print(frame)
print(frame.T) # .Tで行列変換(転置)
print(frame)
# 0 1 2
# 0 1 2 3
# 1 50 60 70
print(frame.T)
# 0 1
# 0 1 50
# 1 2 60
# 2 3 70
ezodfでCalcから読み込んで実行
#!/usr/bin/python3
# coding: UTF-8
import pandas as pd
import ezodf
import sys
def read_ods(filename, sheet_no=0, header=0):
tab = ezodf.opendoc(filename=filename).sheets[sheet_no]
return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] for col in tab.columns()})
d = read_ods(filename = 'リストからデータフレームを作る.ods')
print(d)
print(d.T)
ちゃんと動作しています。
後、いろいろやって見ましたが全てができる訳ではないようです。
Intro to Data Structuresさんのサイトを参考にします。
https://pandas.pydata.org/pandas-docs/stable/dsintro.html
import pandas as pd
d = {'one' : [1., 2., 3., 4.],
'two' : [4., 3., 2., 1.]}
print(pd.DataFrame(d))
'''
one two
0 1.0 4.0
1 2.0 3.0
2 3.0 2.0
3 4.0 1.0
'''
print(pd.DataFrame(d, index=['a', 'b', 'c', 'd']))
'''
one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0
'''
ezodfでindexを変更します。
import pandas as pd
import ezodf
def read_ods(filename, sheet_no=0, header=0):
tab = ezodf.opendoc(filename=filename).sheets[sheet_no]
return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] for col in tab.columns()})
d = read_ods(filename = 'index変更.ods')
print(d)
print(pd.DataFrame(d, index=['a', 'b', 'c', 'd']))
indexは変更されていますが、他のデータがNaNになってしまいます。
これ以外は、大体できていると思います。
全てをやった訳でもないので、まだ不具合がでる可能性もあります。