pandas dataframe将列转换为行

时间:2016-06-24 17:52:59

标签: python pandas

我正在寻找一种将数据帧列转换为行的方法。以下是我的示例数据框:

mylist= [['xx'], [None, 'yy'], ['xx', None], ['xx',None],['xx','yy']]

pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2'])

输入数据框:

-------------------
Ind | Col1 | Col2 |
-------------------
A   | xx   | None |
B   | None | yy   |
C   | xx   | None |
D   | xx   | None |
E   | xx   | yy   |
-------------------

我想将列拆分为数据框中的单独行。下面是我想要的输出的样子。任何人都可以建议如何实现以下目标。

所需数据框:

------------------------
Ind | Values | Columns |
------------------------
A   | xx     | Col1    |
B   | yy     | Col2    |
C   | xx     | Col1    |
D   | xx     | Col1    |
E   | xx     | Col1    |
E   | xx     | Col2    |
------------------------

谢谢,
Rtut

3 个答案:

答案 0 :(得分:3)

另一种选择是使用melt

longDf = pd.melt(df.reset_index(), id_vars=['index'], var_name=['Columns'])
longDf[pd.notnull(longDf.value)]

  index Columns value
0   A   Col1    xx
2   C   Col1    xx
3   D   Col1    xx
4   E   Col1    xx
6   B   Col2    yy
9   E   Col2    yy

答案 1 :(得分:2)

df = pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2'])
# rotate df
stacked_df = pd.DataFrame(df.stack().reset_index())
# name columns
stacked_df.columns = ['Ind','Columns','Values']
# reorder columns
reordered_df = pd.DataFrame(stacked_df,columns=['Ind','Values','Columns'])

结果:

>>> reordered_df
  Ind Values Columns
0   A     xx    Col1
1   B     yy    Col2
2   C     xx    Col1
3   D     xx    Col1
4   E     xx    Col1
5   E     yy    Col2

答案 2 :(得分:1)

如果是两个值,您似乎只想要第一个(例如示例的最后一行)。

如果两列都有值,您可以使用loc首先将第二个值设置为None。

df.loc[(df.Col1.notnull()) & (df.Col2.notnull()), 'Col2'] = None

然后,您可以melt结果。

>>> pd.melt(df.reset_index(), id_vars='index', var_name='Columns', value_name='Values'
            ).dropna().set_index('index')[['Values', 'Columns']]

      Values Columns
index               
A         xx    Col1
C         xx    Col1
D         xx    Col1
E         xx    Col1
B         yy    Col2