2016-06-16 8 views

答えて

3

あなたはすべてのcolumns.dropna()後と.reset_index()そうのように組み合わせることがpd.concatを使用することができます得るために

pd.concat([df[col].dropna().reset_index(drop=True) for col in df], axis=1) 

Age Sex Name 
0 12.0 Male David 
+0

私はこれをしようとしたときにエラーを属性取得...はAttributeError:「DATAFRAME」オブジェクトはありません属性「アイテム」バージョンの問題だ – Avis

+0

、簡素化を参照してください更新されています。 – Stefan

+0

素晴らしいですが、魅力のように動作します。ありがとう@Stefan – Avis

1

別の方法は、applyに最初に戻すためにfirst_valid_indexを呼び出し、ラムダあります有効な行の値:

In [246]: 
df.apply(lambda x: pd.Series(x[x.first_valid_index()])) 

Out[246]: 
    Age Sex Name 
0 12.0 Male David 
0

これは厄介です。パンダは索引の自動再構成をしません。だからあなたはいくつかの操作でやりなければなりません。知らんどちらが最善です:

import numpy as np,pandas as pd 

df= ''' 
12  NaN NaN 
NaN Male NaN 
NaN NaN David''' 

df = np.array(df.split()) 

df.shape=(3,3) 

df = pd.DataFrame(df,columns='Age Sex Name'.split()) 
df.replace('NaN',np.nan,True) 

def func(x): 
    x.dropna(inplace=True) 
    x.reset_index(inplace=True,drop=True) 
    #s=pd.Series(vals,index=range(vals.shape[0])) 
    #print vals.shape 
    #print x.shape 
    return x 

def func1(x): 
    x=x.dropna().values 
    idx=range(x.shape[0]) 
    x=pd.Series(x,index=idx) 
    #print vals.shape 
    #print x.shape 
    return x 

def func2(x): 
    idx=x.first_valid_index() 
    x=x[idx] 
    x=pd.Series(x) 
    return x 

print '#'*20 
print df 
print '#'*20 
print 1,df.apply(func,axis=0) 
print '#'*20 
print 2,df.apply(func1,axis=0) 
print '#'*20 
print 3,df.apply(func2,axis=0) 
print '#'*20 
print 3,pd.DataFrame({colId: df[colId].dropna().values for colId in df}) 

''' 
output: 

#################### 
    Age Sex Name 
0 12 NaN NaN 
1 NaN Male NaN 
2 NaN NaN David 
#################### 
1 Age Sex Name 
0 12 Male David 
#################### 
2 Age Sex Name 
0 12 Male David 
#################### 
3 Age Name Sex 
0 12 David Male 

''' 
関連する問題