【Python】特定の文字で始まる(終わる)カラムを抽出したい【Pandas】
こんな感じのデータフレームから'_x'で終わるカラムを取り出す。
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')]
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がこれ。
これをmeltを使って変形。
df_melted = df_pivot.reset_index().melt(id_vars=['index'])
これをpivotで元の形に戻せる。
df_pivoted = df_melted.pivot(index='index', columns='variable', values='value')
逆ピボットテーブルの変換は、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
画像のようなデータフレームを作りたいときのメモ。
下記のようにやればできる。
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
【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に書けばいいらしい。
参考:
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms