2017-12-06 10 views
0

これを行うにはエレガントな方法が必要ですが、まだ見つかりませんでした。私はこのようになります大規模なデータフレームがあります。パンダを使用して列内の不均一なデータを溶かし、NaNを無視

df 
    Name 0   1   2  3  4 
1 apple 2016 W1  NaN   NaN  NaN NaN 
2 orange 2016 W1  2017 W2  NaN  NaN NaN 
3 banana 2016 W2  2017 W3  NaN  NaN NaN 
4 pear 2016 W3  2016 W4  2016 W5 NaN NaN 
6 melon 2016 W2  2016 W4  2017 W5 2017 W6 2017 W7 

をそして、私は2つだけの列nameweekがあるようにデータを溶融したいです。結果は次のようになります:

df_result 

    Name week  
    apple 2016 W1  
    orange 2016 W1 
    orange 2017 W2  
    banana 2016 W2 
    banana 2017 W3 
    pear 2016 W3  
    pear 2016 W4  
    ... etc. 

私が悩んでいるのは、値を失わないことを確実にしながらNaN値を無視する方法です。

私がpd.melt(df, id_vars=['Name'])をしたとき、私は結果が欲しいものかどうか分かりません。

答えて

2

OP1

df.melt('Name').dropna().drop('variable',1) 
Out[62]: 
     Name value 
0 apple 2016 W1 
1 orange 2016 W1 
2 banana 2016 W2 
3  pear 2016 W3 
4 melon 2016 W2 
6 orange 2017 W2 
7 banana 2017 W3 
8  pear 2016 W4 
9 melon 2016 W4 
13 pear 2016 W5 
14 melon 2017 W5 
19 melon 2017 W6 
24 melon 2017 W7 

OP2

df.set_index('Name').stack().reset_index().drop('level_1',1) 
Out[66]: 
     Name  0 
0 apple 2016 W1 
1 orange 2016 W1 
2 orange 2017 W2 
3 banana 2016 W2 
4 banana 2017 W3 
5  pear 2016 W3 
6  pear 2016 W4 
7  pear 2016 W5 
8 melon 2016 W2 
9 melon 2016 W4 
10 melon 2017 W5 
11 melon 2017 W6 
12 melon 2017 W7 
で溶融使用210

OP3

pd.DataFrame({'Name':df.Name.tolist()*5,'Value':np.concatenate(df.iloc[:,1:].values)}).dropna() 
Out[69]: 
     Name Value 
0 apple 2016 W1 
5 apple 2016 W1 
6 orange 2017 W2 
10 apple 2016 W2 
11 orange 2017 W3 
15 apple 2016 W3 
16 orange 2016 W4 
17 banana 2016 W5 
20 apple 2016 W2 
21 orange 2016 W4 
22 banana 2017 W5 
23 pear 2017 W6 
24 melon 2017 W7 
+0

私はところで、OP1 JAG2024 Ywを〜の:-) @最高 – JAG2024

+1

好き:速度を考慮し、OP3は高速である必要があります – Wen

1

スタック

df.set_index('Name').stack().reset_index(1,drop = True) 

Name 
apple  2016 W1 
orange 2016 W1 
orange 2017 W2 
banana 2016 W2 
banana 2017 W3 
pear  2016 W3 
pear  2016 W4 
pear  2016 W5 
melon  2016 W2 
melon  2016 W4 
melon  2017 W5 
melon  2017 W6 
melon  2017 W7 
dtype: object 

に使用したり、いくつかのクリーニング

df.melt(id_vars='Name').sort_values('Name').dropna() 
関連する問題