2017-01-06 1 views
0

python pandasを操作する0.19。Python - 空のデータフレームを開始し、別のデータフレームからデータを取り込みます。

新しいデータフレーム(df2)を既存のデータフレーム(df1)のサブセットとして作成したいと考えています。

df2 = [] 

for i in range(0,N): 
    loc = some complicated logic 
    df1_sub = df1.ix[loc,] 
    df2.append(df1_sub) 

df2 = pd.DataFrame.from_records(df2) 

結果DF2が実際にデータフレームですが、内容はすべてDF1の列名で構成されています

In [1]: df1.head() 
Out [1]: 
    col1_name col2_name col3_name 
0   23   42   55 
1   27   55   57 
2   52   20   52 
3   99   18   53 
4   65   32   51 

ロジックは次のとおりです。DF1はこのようになります。それは次のようになります。

In [2]: df2.head() 
Out [2]: 
    col1_name col2_name col3_name 
0 col1_name col2_name col3_name 
1 col1_name col2_name col3_name 
2 col1_name col2_name col3_name 
3 col1_name col2_name col3_name 
4 col1_name col2_name col3_name 

私はそれはおそらく、リストからデータフレームへの変換に関連するのですが、私は、私はここに欠けている正確に何かわからない知っています。または、これを行うためのより良い方法がありますか?

+0

あなたが望む 'df1.head()'と最終結果を含めてください。それは問題をより理解しやすくします。 – MYGz

+1

私はあなたが何を求めているのかは分かりませんが、取り組むべきことがたくさんあります。絶対に必要でない限り '.ix'を使用しないでください。これを行うためにデータフレームのリストを作成する必要はありませんが、そうした場合、最後の行は 'pd.concat(df2)'に変更する必要があります。論理を構築するためにforループを使用しない可能性があるので、より多くの情報を提供してください。また、 'df2'という名前はあなたがDataFrameを持っていることを意味します。代わりに 'df_list'のようなものを使用してください。 –

+0

forループではlocの値をチェックして、何かが間違っているかどうかを知らせるかもしれません。 – Shijo

答えて

1

を、ソリューションは単に:

pd.concat(df2) 

データタイプdf2で混乱しました。

forループ内のロジックでは、あるインデックスを使用してdf1を直接選択することは不可能です。

0

データフレームをスライスするのはどうですか?

import pandas as pd 
DF1 = pd.DataFrame() 
DF1['x'] = ['a','b','c','a','c','b'] 
DF1['y'] = [1,3,2,-1,-2,-3] 

DF2 = DF1[[(x == 'a' and y > 0) for x,y in zip(DF1['x'], DF1['y'])]] 

これは、追加するよりも効率的でなければなりません。 DF1 [複雑な条件]はブール代数をとります

0

パンダの(実際にはnumpyの)マスクされた配列を利用できます。

import pandas as pd 

df1 = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': ['a', 'b', 'c', 'd', 'e'], 
        'c': [10, 11, 12, 13, 14]}) 

#  a b c 
# 0 1 a 10 
# 1 2 b 11 
# 2 3 c 12 
# 3 4 d 13 
# 4 5 e 14 

のはdf2df1のサブセットである必要がありますと仮定しましょう:それはコラムbcと列aが偶数値がある行だけが必要です:テッドPetrou 1として

df2 = df1[df1['a'] % 2 == 0][['b', 'c']] 
# b c 
# 1 b 11 
# 3 d 13 
関連する問題