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

Python 如何使用Pandas将水平数据帧结构转换为垂直数据帧结构,python,pandas,dataframe,Python,Pandas,Dataframe,你好,我有一个类似的问题,但反过来。我需要知道如何使用第一列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

你好,我有一个类似的问题,但反过来。我需要知道如何使用第一列
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
我想要的输出应该是这样的:

>>> 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
列的条目作为字典的键,对吗?就像一个默认的目录(列表):

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

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

但不是像上面列出的那样

此外,如果有一个解决方案,这将是最理想的

因为如果我知道如何使用key values=list创建字典,我计划循环它以更改格式并创建所需的数据帧,而循环并不总是可取的,尤其是在处理大型数据帧时

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

编辑 刚刚了解了如何创建以列表为值的字典:

>>> 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', '']}
所以我现在的问题是如何利用这个字典创建一个新的数据帧作为所需的输出

谢谢。

试试这个:

(df.melt(id_vars=["id"],value_vars =["tag",'tag2','tag3'],value_name="tag")
 .drop('variable',axis=1)
 .replace('', np.nan,)
 .dropna()
 .sort_values('id')
)
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

尝试类似于
df.mask(df.eq('')。set_index('id')。stack()
正是为了实现这一点。只需将
tag
重命名为
tag0
您好,谢谢您的回复,我将尝试使用您在这里建议的方法。您好,更新@user3483203解决方案有效,但我需要在第一列中重复
id
。您的解决方案的结果有点像groupby()结果?但它是有效的,谢谢你@anky_91你的解决方案正是我想要的。谢谢你,请发表你的答案,这样我就可以投赞成票了。@anky_91:我的答案和你的非常相似。说清楚一点,在我想出我的答案之前,我从来没有见过你的:)谢谢你的回答,解决方案成功了,我只需要添加
df.reset\u索引(inplace=True,drop=True)
谢谢。如果我的问题不是太多,请投票表决,干杯@乔:是的。目前在这个问题上的投票“+1”是我的:)