Python Tipsシリーズ1

8063 ワード

さまざまなpythonテクニック:
1.リストの減算:
リストAは1つの完全な軌跡で、Bはすでに歩いた軌跡で、残りの軌跡を求めます
# A: ['a','b','c','d']
# B: ['a','b']

In [89]: A = ['a','b','c','d']                                                  

In [90]: B = ['a','b']   

In [92]: [x for x in ','.join(A).replace(','.join(B),'').split(',') if x]       
Out[92]: ['c', 'd']


Tip:
Aリストをカンマ接続で文字に変更し、Bリスト接続の文字を置き換えてから分割します(最初の空の要素を削除します)
 
2.リストからマッピング辞書を作成する
名目型変数を数値型変数に変換するのに役立ちます.sklearnのようなLabelEncoder
In [10]: val_list = ['a','b','c']                                                          

In [11]: dict(list(zip(val_list, range(1, len(val_list) + 1))))                            
Out[11]: {'a': 1, 'b': 2, 'c': 3}

3.各パケットの最初の値をリストインデックスで取得する
clus = [8, 7, 5, 4, 1, 1, 2, 4, 4, 3, 4, 9, 2, 6, 10]
cols = ['AMT_ANNUITY_dis_woe',
 'DAYS_BIRTH_dis_woe',
 'DAYS_EMPLOYED_dis_woe',
 'EXT_SOURCE_2_dis_woe',
 'OBS_30_CNT_SOCIAL_CIRCLE_dis_woe',
 'OBS_60_CNT_SOCIAL_CIRCLE_dis_woe',
 'CNT_CHILDREN_dis_woe',
 'NAME_TYPE_SUITE_dis_woe',
 'NAME_INCOME_TYPE_dis_woe',
 'NAME_FAMILY_STATUS_dis_woe',
 'NAME_HOUSING_TYPE_dis_woe',
 'FLAG_PHONE_dis_woe',
 'CNT_FAM_MEMBERS_dis_woe',
 'WEEKDAY_APPR_PROCESS_START_dis_woe',
 'ORGANIZATION_TYPE_dis_woe']
for i in range(1,11):
    print('>>> round %i' % i)
    idx = clus.index(i)
    print('*** varname %s ' % cols[idx])


# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   
>>> round 1
*** varname OBS_30_CNT_SOCIAL_CIRCLE_dis_woe 
>>> round 2
*** varname CNT_CHILDREN_dis_woe 
>>> round 3
*** varname NAME_FAMILY_STATUS_dis_woe 
>>> round 4
*** varname EXT_SOURCE_2_dis_woe 
>>> round 5
*** varname DAYS_EMPLOYED_dis_woe 
>>> round 6
*** varname WEEKDAY_APPR_PROCESS_START_dis_woe 
>>> round 7
*** varname DAYS_BIRTH_dis_woe 
>>> round 8
*** varname AMT_ANNUITY_dis_woe 
>>> round 9
*** varname FLAG_PHONE_dis_woe 
>>> round 10
*** varname ORGANIZATION_TYPE_dis_woe 

 
4.変数の順序を調整します(「3」に関連します.各グループはソートの1つ目のみを選択します)
xcols = sorted(['a1', 'a2', 'a3'])
#   a2    
xcols[xcols.index('a2')] = '_a2'

In [120]: xcols                                                                            
Out[120]: ['a1', '_a2', 'a3']

In [121]: sorted(xcols)                                                                    
Out[121]: ['_a2', 'a1', 'a3']

In [122]: print(ord('_')) 
     ...: print(ord('a'))                                                                  
95
97


Note:文字ASCIIの観点から、下線のシーケンスはaより小さい.表示上、変数に下線を付けるのも分かりやすい(処理済み).
5.Pandas Seriesインデックスによる自動整列によるDataFrameの構築
#         Series
In [1]: import pandas as pd 
   ...: s1 = pd.Series({'a':1, 'c':4,'e':5})
   ...: s2 = pd.Series({'c':22})

In [2]: s1
Out[2]: 
a    1
c    4
e    5
dtype: int64

In [3]: s2
Out[3]: 
c    22
dtype: int64

#       DataFrame
#       (    )
In [4]: df = pd.DataFrame()
   ...: df['s1'] = s1
#      
In [5]: df['s2'] = s2

#   :        
In [7]: df
Out[7]: 
   s1    s2
a   1   NaN
c   4  22.0
e   5   NaN

6.リストのソート
最初の文字をアルファベットとし、その後に順番を表す数値を並べ替えます.aは元の例であり、b 2は所望の結果である.
# python         
a = ['a1', 'a11', 'a2', 'b3', 'b1']
# 1     
print(sorted(a))
['a1', 'a11', 'a2', 'b1', 'b3']

# 2         
print(sorted(a,key=len))
['a1', 'a2', 'b3', 'b1', 'a11']

# 3       
print(sorted(a, key=len,reverse=True))
['a11', 'a1', 'a2', 'b3', 'b1']

#         
b = [(x[0], int(x[1:])) for x in a]
# 1        
print(sorted(b, key=lambda x:x[1]))
[('a', 1), ('b', 1), ('a', 2), ('b', 3), ('a', 11)]

# 2        
print(sorted(b, key=lambda x: (x[0],x[1])))
[('a', 1), ('a', 2), ('a', 11), ('b', 1), ('b', 3)]

b1 = sorted(b, key=lambda x: (x[0], x[1]))
b2 = [x[0]+str(x[1]) for x in b1]
['a1', 'a2', 'a11', 'b1', 'b3']

7.Linuxファイルタイプを表示する行数
便利なコマンドは、対応するディレクトリに切り替えて実行すればいいです(そうしないと、戻りパラメータが長すぎると報告されます)
find . -name "*.py"| xargs wc -l 
 
8.Pandas重複処理(重複除外/保持)
主な注意重複項目の保持
import pandas as pd 


test_df = pd.DataFrame({'A':['a','a','a','b','b','c'],
                        'Val':[1,2,3,4,5,6] })
test_df['dup_mark'] = test_df['A'].duplicated()
test_df1 = test_df[~test_df['A'].duplicated()]
test_df2 = test_df[test_df['A'].duplicated()]


# ------------- Result -------------
In [12]: test_df                                                                
Out[12]: 
   A  Val
0  a    1
1  a    2
2  a    3
3  b    4
4  b    5
5  c    6

In [13]: test_df['dup_mark'] = test_df['A'].duplicated()                        

In [14]: test_df                                                                
Out[14]: 
   A  Val  dup_mark
0  a    1     False
1  a    2      True
2  a    3      True
3  b    4     False
4  b    5      True
5  c    6     False

In [15]: test_df1 = test_df[~test_df['A'].duplicated()]                         

In [16]: test_df1                                                               
Out[16]: 
   A  Val  dup_mark
0  a    1     False
3  b    4     False
5  c    6     False

In [17]: test_df2 = test_df[test_df['A'].duplicated()]                          

In [18]: test_df2                                                               
Out[18]: 
   A  Val  dup_mark
1  a    2      True
2  a    3      True
4  b    5      True

9.DataFrameのapply()、applymap()、map()メソッド
DataFrameオブジェクトのいくつかの行または列、またはDataFrameオブジェクトのすべての要素に対して何らかの演算または操作を行う必要はありません.私たちは低効率で不器用なループを利用する必要はありません.DataFrameは私たちにそれぞれ対応する直接的で簡単な方法を提供しています.apply()とapplymap()です.ここで、apply()メソッドはいくつかの行または列に対して動作し、applymap()メソッドはすべての要素に対して動作する. 
10.オブジェクト辞書
いくつかのデータ構造には一定の階層性があり、直接階層辞書で値を割り当てるのは面倒ですが、使うときは辞書を望んでいます.[この記事]を引用します.https://blog.csdn.net/weixin_42359464/article/details/80882549)の内容が解決できます.簡単に言えば、2つの内蔵関数を増やして辞書化します.
class A(object):
    name = 'wukt'
    age = 18

    def __init__(self):
        self.gender = 'male'

    def keys(self):
        '''         dict(obj)   ,        ,         ,        obj['name']    ,
                        ,         ,           '''
        return ('name', 'age', 'gender')

    def __getitem__(self, item):
        '''    ,    obj['name']      ,        ,           '''
        return getattr(self, item)

a = A()
r = dict(a)
print(r)

11.Pandas Data Frameのいくつかのフォーマット変換
[参考文献]
- 1. カラムインデックス、ローインデックス、およびデータをdfに分離する.to_dict('split'):DFのメタ情報を取得し、フロント分析&処理を行うことができます.
- 2. テーブルを行ごとに辞書dfに変換する.to_dict('rcords'):jinjaテンプレートのループ生成に使用できます
- 3.行インデックスで辞書dfに分割する.to_dict('index'):recordsに似ていますが、行インデックスを使用します.
- 4.デフォルト.df.to_dict('dict'):カラム名をキー値、行インデックスを2次辞書のキー値
- 5.を選択します.df.to_dict('list'):カラム名はキー値であり、値はリスト形態である.
- 6.シーケンス.df.to_dict('series'):カラム名はキー値で、中は辞書です.(カラム単位の構造を構築するために使用できます)
 
12.リストの平坦化
比較的爽やかなフラット化方式.
some_list = sum(some_nested_list, [])