2012-06-10 21 views
19

私はそれに複数の列を持つパンダDataFrameありますパンダ:DATAFRAMEに2つの列を組み合わせた

Index: 239897 entries, 2012-05-11 15:20:00 to 2012-06-02 23:44:51 
Data columns: 
foo     11516 non-null values 
bar     228381 non-null values 
Time_UTC    239897 non-null values 
dtstamp    239897 non-null values 
dtypes: float64(4), object(1) 

foobarはまだ違った名前が付けられ、同じデータを含む列です。 fooを構成する行をbarの名前を維持しながら、理想的にはbarに移動する方法はありますか?バーを作ったNaN値である

Index: 239897 entries, 2012-05-11 15:20:00 to 2012-06-02 23:44:51 
Data columns: 
bar     239897 non-null values 
Time_UTC    239897 non-null values 
dtstamp    239897 non-null values 
dtypes: float64(4), object(1) 

fooからの値に置き換えた:として

は、最後にデータフレームが表示されます。あなたは、データが新しい列barになることをことをしたい場合は、単にdf['bar']に結果を割り当てる

pandas.concat([df['foo'].dropna(), df['bar'].dropna()]).reindex_like(df) 

答えて

21

はこれを試してみてください。

+0

私はパンダの名前空間の関数として 'concat'を見ていないです。私は何が欠けているのか分からない。 – BFTM

+0

パンダのどのバージョンがありますか?この機能は次のとおりです:http://pandas.pydata.org/pandas-docs/stable/merging.html#concatenating-objects – BrenBarn

+0

私はpandas ver 0.6.1を実行していましたが、concat関数は含まれていません。 v 0.7.3へのアップグレードにより、名前空間にconcatが導入されました。魅力的な作品!ありがとう。 – BFTM

21

あなたは直接fillna使用し、列 'bar' に

df['bar'].fillna(df['foo'], inplace=True) 
del df['foo'] 

一般的な例に結果を割り当てることができます。

import pandas as pd 
#creating the table with two missing values 
df1 = pd.DataFrame({'a':[1,2],'b':[3,4]}, index = [1,2]) 
df2 = pd.DataFrame({'b':[5,6]}, index = [3,4]) 
dftot = pd.concat((df1, df2)) 
print dftot 
#creating the dataframe to fill the missing values 
filldf = pd.DataFrame({'a':[7,7,7,7]}) 

#filling 
print dftot.fillna(filldf) 
+0

ですが、dftotが1..4でインデックスされている間、filldfは0..3でインデックス付けされているので、dftot.fillna(filldf)['a'] [4]はnanになります。しないでください7.0 –

5

別のオプション、フレームに.apply()メソッドを使用します。あなたは...既存のデータへの敬意と(少なくとも0.12以降)

import pandas as pd 
import numpy as np 

# get your data into a dataframe 

# replace content in "bar" with "foo" if "bar" is null 
df["bar"] = df.apply(lambda row: row["foo"] if row["bar"] == np.NaN else row["bar"], axis=1) 

# note: change 'np.NaN' with null values you have like an empty string 
+0

キャッチ@ Veenitありがとう – openwonk

3

、より現代的なパンダのバージョンを列を再割り当てDATAFRAMEおよびシリーズのオブジェクトのcombine_first() and update()メソッドを持っていないことができます。あなたのデータフレームがdfと呼ばれていた場合たとえば、あなたはどうなる:

df.bar.combine_first(df.foo) 

のみfoo列にマッチするbar列のナン値を変更するであろうし、そのインプレースだろう。 barの非Nan値をfooの値で上書きするには、update()メソッドを使用します。

2

これはnumpyでも可能です。

df['bar'] = np.where(pd.isnull(df['bar']),df['foo'],df['bar'])

関連する問題