私は下記のものに類似しDataFrame
、私がNaNのを無視し、マージ、1行のデータフレームに変換したいPythonのパンダ:無視して、単一の行に複数の行を変換するのNaNの
Age Sex Name ....
12 NaN NaN
NaN Male NaN
NaN NaN David
それら
Age Sex Name
12 Male David
これを行う方法はPandasですか?
私は下記のものに類似しDataFrame
、私がNaNのを無視し、マージ、1行のデータフレームに変換したいPythonのパンダ:無視して、単一の行に複数の行を変換するのNaNの
Age Sex Name ....
12 NaN NaN
NaN Male NaN
NaN NaN David
それら
Age Sex Name
12 Male David
これを行う方法はPandasですか?
あなたはすべての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
別の方法は、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
これは厄介です。パンダは索引の自動再構成をしません。だからあなたはいくつかの操作でやりなければなりません。知らんどちらが最善です:
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
'''
私はこれをしようとしたときにエラーを属性取得...はAttributeError:「DATAFRAME」オブジェクトはありません属性「アイテム」バージョンの問題だ – Avis
、簡素化を参照してください更新されています。 – Stefan
素晴らしいですが、魅力のように動作します。ありがとう@Stefan – Avis