如何使用Pandas将水平数据框结构转换为垂直结构

时间:2019-09-06 16:42:55

标签: python pandas dataframe

你好,我有一个与此one类似的问题,但是相反。我需要一个思路,如何使用第一列id作为键垂直写入数据框。

因此,我的输入数据框示例如下所示:

>>> df = pd.DataFrame({'id':[1,2,3,4,5], 'tag': ['a','b','c','d','e'], 'tag2': ['f','g','h','i','j'], 'tag3': ['k','l','m','','']})
>>> df
   id tag tag2 tag3
0   1   a    f    k
1   2   b    g    l
2   3   c    h    m
3   4   d    i
4   5   e    j

我想要的输出应该是这样的:

>>> df
    id tag
0    1   a
1    1   f
2    1   k
3    2   b
4    2   g
5    2   l
6    3   c
7    3   h
8    3   m
9    4   d
10   4   i
11   5   e
12   5   j

好像我必须使用id列的条目作为字典的键,对吗?就像default_dict(list)

{1:['a','k','l'], 2:['b','g','l'], 3:['c','h','m'], 4:['d','i'], 5:['e','j']}

我只是很难将每行的所有列值都放入列表中的字典中,我已经知道如果仅使用两(2)列,例如:

some_dict = dict(zip(df['col1'],df['col2']))

但不是上面的列表。

此外,如果有熊猫的解决方案是最理想的。

由于我想出了如何用键值= list创建字典的方法,因此我计划将其循环以更改格式并创建所需的DataFrame,并且并不总是建议循环,尤其是在使用大型DataFrame时。

任何帮助将不胜感激。干杯!

编辑

只是想出了如何创建一个以列表为值的字典:

>>> x = df.set_index('id').T.to_dict('list')
>>> x
{1: ['a', 'f', 'k'], 2: ['b', 'g', 'l'], 3: ['c', 'h', 'm'], 4: ['d', 'i', ''], 5: ['e', 'j', '']}

所以我现在的问题是如何利用这个字典创建一个新的数据框作为所需的输出。

谢谢。

2 个答案:

答案 0 :(得分:3)

(df.melt(id_vars=["id"],value_vars =["tag",'tag2','tag3'],value_name="tag")
 .drop('variable',axis=1)
 .replace('', np.nan,)
 .dropna()
 .sort_values('id')
)

答案 1 :(得分:3)

尝试一下:

df.replace('', np.nan).set_index('id').stack().reset_index(name='tag').drop('level_1',1)

Out[100]:
    id tag
0    1   a
1    1   f
2    1   k
3    2   b
4    2   g
5    2   l
6    3   c
7    3   h
8    3   m
9    4   d
10   4   i
11   5   e
12   5   j