我正在寻找一种将数据帧列转换为行的方法。以下是我的示例数据框:
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
答案 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