更改数据框中列的元素并合并列

Posted

技术标签:

【中文标题】更改数据框中列的元素并合并列【英文标题】:Change elements of the columns in dataframe and merge the columns 【发布时间】:2021-11-24 15:05:07 【问题描述】:

我有一个数据框 df 创建为,

df = pd.DataFrame([
     [0, 1, 0],
     [1, 0, 0],
     [0, 1, 0]],
     columns=['Mon','Tue','Wed'])

df:
    Mon Tue Wed
0   0   1   0
1   1   0   0
2   0   1   0

对于这个数据框,我想将元素'1'-替换为相应的列名,将'0'替换为-“”,最后将它们全部组合起来。

1 和 0 也可以是字符 - 'X' 和 '-'。

Desired Output:
    Day
0   Tue
1   Mon
2   Tue

【问题讨论】:

【参考方案1】:

没有重复值(每行只有一个1

axis=1 上使用idxmax

df.idxmax(axis=1)

注意。如果您有 '-'/'X' 作为值,请使用 df.eq('X').idxmax(axis=1)

输出:

0    Tue
1    Mon
2    Tue

作为数据框:

df.idxmax(axis=1).rename('Day').to_frame()

输出:

   Day
0  Tue
1  Mon
2  Tue

可能的重复

你可以使用melt:

df = pd.DataFrame([
     [0, 1, 1],
     [1, 0, 0],
     [0, 1, 0]],
     columns=['Mon','Tue','Wed'])

# below use 'value == "X"' if '-'/'X' values
df.melt(var_name='Day', ignore_index=False).query('value == 1')[['Day']]

输出:

   Day
1  Mon
0  Tue
2  Tue
0  Wed

【讨论】:

这很好用。谢谢你【参考方案2】:

使用DataFrame.dot,列名用逗号分隔,如果可能,每行重复1

df1 = df.dot(df.columns + ',').str[:-1].to_frame('Day')
print (df1)
   Day
0  Tue
1  Mon
2  Tue

如果有多个值:

df = pd.DataFrame([
     [0, 1, 1],
     [1, 0, 0],
     [0, 1, 0]],
     columns=['Mon','Tue','Wed'])


print (df)
   Mon  Tue  Wed
0    0    1    1
1    1    0    0
2    0    1    0


df1 = df.dot(df.columns + ',').str[:-1].to_frame('Day')
print (df1)
       Day
0  Tue,Wed
1      Mon
2      Tue

【讨论】:

以上是关于更改数据框中列的元素并合并列的主要内容,如果未能解决你的问题,请参考以下文章

如何选择数据框中列的前 3 个值 - 熊猫

我可以更改 Spark 数据框中列的可空性吗?

使用 R [重复] 更改数据框中列的顺序

使用 lapply 更改列表元素中列的格式

在 mySQL 中,是不是可以从两个表中选择并合并列?

给定列名,数据框中列的平均值