将Pandas数据框的列和索引转换为值

7

I have a dataframe in a "yes/no" format like

    7   22
1   NaN t
25  t   NaN

其中“t”代表“是”,我需要将其转换为X-Y表格,因为列名是X坐标,索引是Y坐标:

  X  Y
1 22  1
2  7 25

一个类似伪代码的例子:
if a cell = "t":
     newdf.X = df.column(t)
     newdf.Y = df.index(t)
3个回答

6

试试这个:

# Use np.where to get the integer location of the 't's in the dataframe
r, c = np.where(df == 't')

# Use dataframe constructor with dataframe indexes to define X, Y
df_out = pd.DataFrame({'X':df.columns[c], 'Y':df.index[r]})
df_out

输出:

    X   Y
0  22   1
1   7  25

根据@RajeshC的评论更新:

给定数据框df,

      7   22
1   NaN    t
13  NaN  NaN
25    t  NaN

然后:

r, c = np.where(df == 't')
df_out = pd.DataFrame({'X':df.columns[c], 'Y':df.index[r]}, index=r)
df_out = df_out.reindex(range(df.shape[0]))
df_out

输出:

     X     Y
0   22   1.0
1  NaN   NaN
2    7  25.0

如果一行不包含“t”,则会删除该行。 - Rajesh
@Rajesh... 是的。我们需要创建一个更加健壮的示例,带有预期输出。 - Scott Boston
3
针对所提出的问题,我认为这是一个优秀的回答..!! - anky
1
@anky 谢谢你的信任投票。 - Scott Boston
1
感谢您的支持。您是一个巨大的帮助!还有@RajeshC - Fred

5

stack 的另一个选项:

pd.DataFrame.from_records(
    df.stack().index.swaplevel(),
    columns=['X', 'Y'])

输出:

    X   Y
0  22   1
1   7  25

0
基于堆栈的魔力,我的答案是对@Perl的答案进行微调(因为声望<50而无法评论)-
df.stack().to_frame().reset_index().drop(0,axis = 1).rename(columns = {'level_0':"Y","level_1":"X"}).reindex(columns=["X","Y"])

PS - 感谢Kristian Canler的编辑。


我认为这可能作为一个单独的答案是可以的,但请删除图像并将其粘贴到输出中,并按您格式化代码的方式进行格式化。谢谢! - semblable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接