2017-05-30 10 views
1

面白い形式のデータをいくつか整理しようとしています。基本的に、データフレームは、次のようになります。1つの値の発生に応じてデータフレームをグループ化する

1  2  3 
NaN | a | b | 
    |foo | bar | 
    |foo2 | bar2| 
NaN | c | d | 
    |foo3 | bar3| 

そして、私は別のNaNを満たすまで、私は列1にはNaNを持つたびに、私は、私は列AとBに持っているものの組み合わせで列を埋めるしたいと思います。最後に、NaNを含む行を取り除きたい。

結果のデータ・フレームは次のようになります。

1  2  3 
a_b |foo | bar | 
a_b |foo2 | bar2| 
c_d |foo3 | bar3| 

私は解析する文字列で、私が欲しいものを得ることができたが、コードは巨大であり、私はパンダを使用してそれを行うためのより高速な方法があると確信しています。

これは私の最初の投稿です。私は、筆記基準を遵守していないか、特にそのタイトルが明示的でない場合、謝罪します。私は改善するためのコメントを感謝します。

+0

あなたがこれまでにしようとしているものをご提示ください。 – MrLeeh

答えて

0

これらのNaNが本当にnull値ある場合は、このような何かを試みることができる:

df['key']=df['1'].isnull().cumsum() 

df_header = df[df['1'].isnull()] 

df_out = df_header.merge(df[df['1'].notnull()], on='key',suffixes=('_x','')).set_index(['2_x','3_x']) 

df_out.index = df_out.index.map('_'.join) 

df_out.drop(['1_x','key','1'],axis=1).rename_axis(['1']).reset_index() 

が出力:

1  2  3 
0 a_b  foo  bar 
1 a_b  foo2 bar2 
2 c_d  foo3 bar3 
+1

ワットありがとう@スコットボストン '.cumsum()'は私が私をロック解除するために探していたものです! 'groupby()'のようなことを簡単に行うことができます(あなたの答えをアップアップすることができればと思います)。あなたが特定の値 "A"を扱う方法とnull値ではないことを考えているのであれば、私は興味がありますか? (列1に他のランダム値の中間に "A"値があると仮定すると、 '.cumsum'は助けになりません) – Bravo1

+0

isnullはtrueまたはfalseを返すので、同じことができます。 (df ['1'] == 'A')。cumsum()のようなものです。 falseのtrueはintに変換されます。つまり1または0で、cumsumは列の上でそれを合計します。 –

+0

さて、それではっきりしています;)私は 'isnull()'を使うためにNaNで "A"の値を置き換えることを考えていました。あなたの助けのために再びThxボストン@スコット – Bravo1

0

あなたが機能fillnaを使用してそれを行うことができます。

import pandas as pd 
import numpy as np 

#df test 
l = ["foo", 
"foo2", 
"foo3", 
"foo4" ] 
df = pd.DataFrame(l) 
df[1] = [np.nan for i in range(3)]+[1] 
df[2] = ["bar"+str(i)for i in range(4)] 

#Filling the nan with the additionned value of the two colums 
df[1] = df[1].fillna(df[2]+df[0]) 

入力

0  1 2 
0 foo  NaN bar0 
1 foo2 NaN bar1 
2 foo3 NaN bar2 
3 foo4 1.0 bar3 

出力

0  1   2 
0 foo  bar0foo  bar0 
1 foo2 bar1foo2 bar1 
2 foo3 bar2foo3 bar2 
3 foo4 1.0   bar3 
関連する問題