更改数据框中列的元素并合并列
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
【讨论】:
以上是关于更改数据框中列的元素并合并列的主要内容,如果未能解决你的问题,请参考以下文章