将列中的不均匀数据融化并使用pandas忽略NaN

时间:2017-12-06 23:02:35

标签: python pandas dataframe melt

必须有一种优雅的方式来做到这一点,但我还没有找到它。我有一个大型数据框,看起来像这样:

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

我想要融合数据,只有两列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 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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()