【问题标题】:Replacing values in a Pandas data frame with the order of their columns用它们的列顺序替换 Pandas 数据框中的值
【发布时间】:2018-01-09 18:50:57
【问题描述】:

我们如何替换数据框中的特定值,以使替换等于这些特定值所在的第 i 列的顺序?例如我有这个 DF:

A  B  C
0  0  1
1  0  0 
1  0  0
0  1  0
1  0  1

用 1 所在的第 i 列(第 1 列、第 2 列、第 3 列等)的顺序替换此数据框中的所有列,这样它就变成了这样:

A  B  C
0  0  3
1  0  0 
1  0  0
0  2  0
1  0  3

这是我认为可行的,但它没有:

 DF_2= [(0 if i== 0 else j  for i in DF.iloc[:,j]  ) for j in range(DF.shape[1]) ]

【问题讨论】:

  • 你的代码返回了什么?请也包括在内。

标签: python list pandas


【解决方案1】:

或者你可以试试这个。(PS:你可以使用range来生成list:list(range(1,df1.shape[1]+1)) )

df.mul([1,2,3])
Out[433]: 
   A  B  C
0  0  0  3
1  1  0  0
2  1  0  0
3  0  2  0
4  1  0  3

【讨论】:

    【解决方案2】:

    如果只有10 值,您可以使用valuesnp.arrange 转换多个numpy 数组:

    print (np.arange(1, len(df.columns)+1))
    [1 2 3]
    
    
    print (df.values * np.arange(1, len(df.columns)+1))
    [[0 0 3]
     [1 0 0]
     [1 0 0]
     [0 2 0]
     [1 0 3]]
    
    df = pd.DataFrame(df.values * np.arange(1, len(df.columns)+1),
                      index=df.index, columns=df.columns)
    print (df)
       A  B  C
    0  0  0  3
    1  1  0  0
    2  1  0  0
    3  0  2  0
    4  1  0  3
    

    更通用的解决方案(如果 0 和另一个数字)是将值转换为布尔值:

    print (df)
       A  B  C
    0  0  0  4
    1  1  0  0
    2  1  0  0
    3  0  6  0
    4  1  0  1
    
    df = pd.DataFrame(df.astype(bool).values * np.arange(1, len(df.columns)+1),
                      index=df.index, columns=df.columns)
    print (df)
       A  B  C
    0  0  0  3
    1  1  0  0
    2  1  0  0
    3  0  2  0
    4  1  0  3
    

    感谢您提供其他解决方案(Jon ClementsMaxU):

    df = df.replace({col: {1: n} for n, col in enumerate(df.columns[1:], 2)})
    print (df)
       A  B  C
    0  0  0  3
    1  1  0  0
    2  1  0  0
    3  0  2  0
    4  1  0  3
    

    df = df * np.arange(1, df.shape[1]+1)
    print (df)
       A  B  C
    0  0  0  3
    1  1  0  0
    2  1  0  0
    3  0  2  0
    4  1  0  3
    

    时间安排

    N = 100
    cols = ['col' + str(i) for i in range(N)]
    df = pd.DataFrame(np.random.choice([0,1], size=(100000,N)), columns=cols)
    [100000 rows x 100 columns]
    #print (df)
    
    
    In [101]: %timeit pd.DataFrame(df.values * np.arange(1, len(df.columns)+1), index=df.index, columns=df.columns)
    10 loops, best of 3: 25.1 ms per loop
    
    In [102]: %timeit df.replace({col: {1: n} for n, col in enumerate(df.columns[1:], 2)})
    1 loop, best of 3: 1.39 s per loop
    
    In [103]: %timeit df * np.arange(1, df.shape[1]+1)
    10 loops, best of 3: 21 ms per loop
    
    #Wen solution
    In [104]: %timeit (df.mul(list(range(1, len(df.columns)+1))))
    10 loops, best of 3: 38.7 ms per loop
    

    【讨论】:

    • df.replace({col: {1: n} for n, col in enumerate(df.columns[1:], 2)})
    • AFAIK 我们可以直接完成,无需将其转换为 numpy 数组 (.values):df * np.arange(1, df.shape[1]+1)
    • @JonClements - 给我一些时间 :)
    • @JonClements - replace 最慢。
    • @jezrael 并不感到惊讶 - 认为它还有更多工作要做(如果需要,可以做的不仅仅是简单的 1->col idx - 感谢您的检查:)
    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多