简体   繁体   English

熊猫数据框将列转换为行

[英]pandas dataframe convert columns as rows

I am looking for a way to convert my dataframe columns as rows. 我正在寻找一种将数据框列转换为行的方法。 Following is my example dataframe: 以下是我的示例数据框:

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

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

Input DataFrame: 输入数据框:

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

I want to split my columns as separate rows in the dataframe. 我想将列拆分为数据帧中的单独行。 Below is how my desired output looks like. 下面是我想要的输出的样子。 Can anyone suggest how to acheive the following. 任何人都可以建议如何实现以下目标。

Desired dataframe: 所需的数据框:

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

Thanks, 谢谢,
Rtut 鲁特

Another option is to use melt : 另一种选择是使用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
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'])

Results in: 结果是:

>>> 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

In the case of two values, it appears that you only want the first (eg the last row of your example). 对于两个值,似乎只需要第一个(例如,示例的最后一行)。

You can use loc to first set the second value to None in the case both columns have values. 如果两个列都有值,则可以使用loc首先将第二个值设置为None。

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

You can then melt your results. 然后,您可以融合您的结果。

>>> 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM