必须有一种优雅的方式来做到这一点,但我还没有找到它。我有一个大型数据框,看起来像这样:
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
我想要融合数据,只有两列name
和week
。所以结果应该是这样的:
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'])
时,我不确定结果是否符合我的要求。
答案 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()