【Python】特定の文字で始まる(終わる)カラムを抽出したい【Pandas】

こんな感じのデータフレームから'_x'で終わるカラムを取り出す。 f:id:gushigo:20180711231120p:plain

df = pd.DataFrame([[1,2,3,4]], columns = ['col1_x', 'col2_x', 'col1_y', 'col2_y'])  #私が作りました(^p^)

下記のコマンドにより抽出。

df_extracted = df.loc[:,df.columns.str.endswith('_x')]

f:id:gushigo:20180711231434p:plain

pandas.mergeでsuffixを付けないときによくやるかも。
サフィックスではなくプリフィックスがついているときは下記コマンド。

df_extracted = df.loc[:,df.columns.str.startswith('col1_')]

中身のコマンドは実行すると配列になってる。

df.columns.str.endswith('_x')
Out[1]: array([ True,  True, False, False], dtype=bool)

ちなみにcolumns.strはアクセサという仕組み。

【iPython】テキストの貼り付け

ipythonのコンソールに複数行の命令を張り付けて実行したいときは
%cpasteコマンドを使う。

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:
:a ='Hello.'
:print(a)
:--
Hello.

気を付けるのは下記の点くらい。

  • 先頭はインデントに気を付けること。改行から始めると問題ない。
  • 最後には「--」の文字を書くこと。

また、%pasteコマンドだとクリップボードの内容を実行してくれる。

【Python/Pandas】ピボットテーブル化と逆変換

pandas ver0.22

pd.pivotでピボットテーブルを作成。
pd.meltで逆の変換ができる。
コード全体は下記のとおり。

import pandas as pd
df_pivot = pd.DataFrame([[101, 201, 301],
                         [102, 202, 302],
                         [103, 203, 303]], columns=['a', 'b', 'c'], index=['a', 'b', 'c'])
df_melted = df_pivot.reset_index().melt(id_vars=['index'])
df_pivoted = df_melted.pivot(index='index', columns='variable', values='value')


まず元のデータフレームdf_pivotがこれ。 f:id:gushigo:20180528225700p:plain

これをmeltを使って変形。

df_melted = df_pivot.reset_index().melt(id_vars=['index'])

f:id:gushigo:20180528225657p:plain

これをpivotで元の形に戻せる。

df_pivoted = df_melted.pivot(index='index', columns='variable', values='value')

f:id:gushigo:20180528225705p:plain

逆ピボットテーブルの変換は、Tidy data(整然データ)化と呼べると思う。

pd.pivot()はデータの重複がないことを前提としている。
重複があると下記のようなエラーメッセージが出る。

ValueError: Index contains duplicate entries, cannot reshape

こういうときはpd.drop_duplicatess()で重複を削除するか、pd.pivot_tableを使うようにしましょう。

【Python】Pandasのデータフレームの要素に配列を代入したい

環境: python 3.6 pandas 0.22.0

画像のようなデータフレームを作りたいときのメモ。 f:id:gushigo:20180504184131p:plain

下記のようにやればできる。

array_1d = np.ones(2)
array_2d = np.ones([1, 2]) * 2

df.loc[0, 'obj'] = array_1d
df.loc[[1], 'obj'] = [array_2d]
#別解1
df['obj'] = [array_1d, array_2d]

思いのほか難しい。 numpy配列の次元によって代入方法を変えないといけない。 pandasのsetter部分を読めばちゃんと理解できるかも。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.zeros([2,2]), columns=['num', 'obj'])
df['obj'] = df['obj'].astype('object')


#成功
df.loc[0, 'obj'] = array_1d
df.loc[[1], 'obj'] = [array_2d]
df['obj'] = [array_1d, array_2d]
df.loc[:, 'obj'] = [array_1d, array_2d]
#ちなみにこれもできる
df['obj'] = [array_1d, array_1d]
df['obj'] = [array_2d, array_2d]
df.loc[:, 'obj'] = [array_2d, array_2d]

#失敗(エラー)
#ValueError: Must have equal len keys and value when setting with an ndarray
df.loc[0, 'obj'] = [array_1d]
df.loc[[0], 'obj'] = [array_1d]
df.loc[[0], ['obj']] = [array_1d]
df.loc[[0], 'obj'] = [array_1d]
df.loc[0, 'obj'] = array_1d
df.loc[1, 'obj'] = array_2d
df.loc[:, 'obj'] = [array_1d, array_1d]

#失敗(形式が異なる)
df.loc[0, ['obj']] = [[array_1d]]
df.loc[[0], ['obj']] = [[array_1d]]
df.loc[[0], 'obj'] = [[array_1d]]

ちなみにtypeは下記の関係

print('1', type( df.loc[0,   'num'] ) )
print('2', type( df.loc[[0], 'num'] ) )
print('3', type( df.loc[0,   'obj'] ) )
print('4', type( df.loc[[0], 'obj'] ) )
print('5', type( df.loc[[0], ['obj']] ) )
print('6', type( df.loc[0,   ['obj']] ) )

##########
#出力結果
##########
1 <class 'numpy.float64'>
2 <class 'pandas.core.series.Series'>
3 <class 'float'>
4 <class 'pandas.core.series.Series'>
5 <class 'pandas.core.frame.DataFrame'>
6 <class 'pandas.core.series.Series'>

【Ubuntu】initramfsとでて起動できない

busyboxとかinitramfsとか出てOSが起動しない。 rebootコマンドは使えたが、rebootしても同じ現象が続いた。 どうやらブート時のエラーらしい。 下記コマンドで復旧した。

fsck /dev/sda1

参考: ubuntuで起動時にbusyboxとなり起動しない場合の対処法

【Caffe】HDF5レイヤーのforward

Pythonでの話。
type: "HDF5Data"のレイヤーでフォワードプロパゲーションすると、
H5ファイルの1個先のデータが勝手に読み込まれるらしい。
そのためPython上でHDF5Dataレイヤーに自分でデータをセットしようとしても、
H5ファイルから勝手に読み込まれたデータで上書きされてしまう。
というわけで、trainのときはHDF5Data、test_netのときはDummyDataとすることで対処した。

なんかほかにいい方法がないものか。

【Python】UbuntuでAnaconda

Ubuntu16.04でAnaconda4.4をインストールしてSpyderを使おうとしたら下記のエラーが出た。

This application failed to start because it could not find or load the Qt platform plugin "xcb"

下記のようにしてspyderを使っていたけど、これは間違い。

Qtがちゃんと使えておらず、グラフが書けない。

 cd ~/anaconda3/lib
 ../bin/spyder

下記の文を~/.bashrcに書けばいいらしい。

参考:

https://stackoverflow.com/questions/17106315/failed-to-load-platform-plugin-xcb-while-launching-qt5-app-on-linux-without

 export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms