2017-07-30 13 views
1

* argsを使用してPandas DataFrameの行データに関数を適用したいとします。Pandas:実行時に(* argsを使用して)定義された列の各行に沿ったマップ関数

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) 
def f(*args): 
    cols = [c for c in args] 
    return max(cols) 

m = list(map(f,df['A'],df['B'],df['C'],df['D'])) 

個別にすべての列を一覧表示することなく、このようにそれを行うための方法があります: これは、(行の最大値を取得するために、おもちゃの例)のように行うことができますか?たとえば、データフレームに任意の列があり、実行時に定義されます。

(*引数が不可能な場合)

+0

あなたはhttps://pandas.pydata.org/pandas-docs/st([ 'DataFrame.apply']を使用することはできません有能/生成/ pandas.DataFrame.apply.html)? – Evert

答えて

2

を最大でも簡単な方法で行うことができるが、どのように1行に任意の関数を適用することができます見つけることが行によって、プロセスのためにaxis=1であなたがapplyを必要とするようで、各行がありますSeriesにconverterted:

def f(x): 
    print (x) 
    #sample function 
    return x.max() 

print (df.apply(f, axis=1)) 

サンプル:

np.random.seed(45) 
df = pd.DataFrame(np.random.randint(0,100,size=(3, 4)), columns=list('ABCD')) 
print (df) 
    A B C D 
0 75 30 3 32 
1 95 61 85 35 
2 68 15 65 14 

def f(x): 
    print (x) 
    #sample function 
    return x.max() 

A 75 
B 30 
C  3 
D 32 
Name: 0, dtype: int32 
A 95 
B 61 
C 85 
D 35 
Name: 1, dtype: int32 
A 68 
B 15 
C 65 
D 14 
Name: 2, dtype: int32 

print (df.apply(f, axis=1)) 
0 75 
1 95 
2 68 
dtype: int64 

そして必要性のリストの場合:

print (df.apply(f, axis=1).tolist()) 
[75, 95, 68] 
+1

「正しい」方法と思われる – user3142067

1

あなたは、実行時に列を組み立てる:

cols = [df[x] for x in 'ABCD'] 

*argsを使用します。

m1 = list(map(f, *cols)) 

は同じ結果を与えます 印刷(df.head(5):

m2 = list(map(f,df['A'],df['B'],df['C'],df['D'])) 
>>> m1 == m2 
True 
1

あなたは1を指定された軸と機能に特定の列を送信する場合それは賢明すなわち

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) 
def f(*args): 
    cols = [c for c in args] 
    return max(cols) 

m = df.apply(lambda x: f(x['A'],x['B'],x['C'],x['D']),axis=1) 

出力を行に行くことができapplylambdaを使用することができます)

 
    A B C D 
0 63 95 94 98 
1 87 42 18 67 
2 1 89 53 42 
3 37 62 22 69 
4 53 1 41 88 
print(m.head(5)) 
 
0 98 
1 87 
2 89 
3 69 
4 88 
dtype: int64 
関連する問題