2016-11-02 3 views
1

の列を組み合わせる:は次のようにデータフレームを持つDATAFRAME

  • 因子/カテゴリ欄['a', 'b']

    import pandas 
    
    df = pandas.DataFrame({'a': [1, 2, 3], 'b': [9, 8, 7], 'c': [4, 5, 6]}) 
    df 
    

    enter image description here

    は私が持つデータフレームを持っていると思います。このコラムの名前は、私は気にしません。

  • ['a', 'b']要因に応じて、a又はbカラムの古い値を持つ列。このコラムの名前は、私は気にしません。
  • c列の値と名前を(実際のデータフレームは、私が維持したいと思いますいくつかの列を持っている)してください。
  • 私は、得られたデータフレーム内の列の順序を気にしない、またそれらのいくつか(または任意の)場合は、インデックスとして設定されています。

これは私が取得したいものの一例である:

df['name_a'] = 'a' 
df['name_b'] = 'b' 

c0 = pandas.concat([df['name_a'], df['name_b']]) 
c1 = pandas.concat([df['a'], df['b']]) 
c2 = pandas.concat([df['c'], df['c']]) 

newdf = pandas.concat([c0, c1, c2], axis=1) 
newdf 

enter image description here

は、同じ結果を達成するためのより良い方法はありますか?私はそれがとても醜いと感じています。おそらく、私が行方不明と理解するコードは非常にクリーンかつ簡単になりますしていますpandas機能?

答えて

1

私はあなたがmeltが必要だと思う:

print (pd.melt(df,id_vars='c', var_name='0', value_name='1')) 
    c 0 1 
0 4 a 1 
1 5 a 2 
2 6 a 3 
3 4 b 9 
4 5 b 8 
5 6 b 7 

sort_valuesstackのもう一つの解決策:

df1 = df.set_index('c').stack().reset_index().sort_values('level_1') 
df1.columns = ['c', '0','1'] 
print (df1) 
    c 0 1 
0 4 a 1 
2 5 a 2 
4 6 a 3 
1 4 b 9 
3 5 b 8 
5 6 b 7 

もっと一般的な解決策 - 変数colsにフィルタのabでないすべての列をlist comprehensionを使用:

cols = [col for col in df.columns if col not in ['a','b']] 
print (cols) 
['c'] 

print (pd.melt(df,id_vars=cols, var_name='0', value_name='1')) 
    c 0 1 
0 4 a 1 
1 5 a 2 
2 6 a 3 
3 4 b 9 
4 5 b 8 
5 6 b 7 
01別の列に gを追加して

サンプル:numpy.setdiff1d

df = pd.DataFrame({'a': [1, 2, 3], 
        'b': [9, 8, 7], 
        'c': [4, 5, 6], 
        'g': [0, 1, 7]}) 

print (df) 
    a b c g 
0 1 9 4 0 
1 2 8 5 1 
2 3 7 6 7 

cols = [col for col in df.columns if col not in ['a','b']] 
print (cols) 
['c', 'g'] 

高速化ソリューション:

cols = np.setdiff1d(df.columns, ['a','b']).tolist() 
print (cols) 
['c', 'g'] 

print (pd.melt(df,id_vars=cols, var_name='0', value_name='1')) 
    c g 0 1 
0 4 0 a 1 
1 5 1 a 2 
2 6 7 a 3 
3 4 0 b 9 
4 5 1 b 8 
5 6 7 b 7 
+0

おかげで、これはかなり良いですね!ただし、「*実際のデータフレームにはいくつかの列があります」(つまり、多くの 'c'列)。 'c'の代わりに' a'と 'b'をパラメータとして使う方法がありますか? ( 'A'と 'B'は常に2ですが、別の名前で 'C'の列がたくさんある、と私はそれらのすべてを維持したいと思います)。 – Peque

+0

確かに、私に秒をください。 – jezrael

+0

私の答えを更新してください。 – jezrael

関連する問題