【问题标题】: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

【问题讨论】:

    标签: python pandas dataframe numpy merge


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2021-07-21
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多