【问题标题】:Set Column Value Based on Calculate Condition from Each Row根据每行的计算条件设置列值
【发布时间】:2021-07-30 05:26:45
【问题描述】:

我有一个空数据框

columns_name = list(str(i) for i in range(10))
dfa = pd.DataFrame(columns=columns_name, index=['A', 'B', 'C', 'D'])
dfa['Count'] = [10, 6, 9, 4]
0 1 2 3 4 5 6 7 8 9 Count
A NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10
B NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6
C NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9
D NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4

我想将Nan 值替换为与max(Count) - Current(max) 不同的符号。 所以,最终的结果会是这样的。

0 1 2 3 4 5 6 7 8 9 Count
A NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10
B NaN NaN NaN NaN NaN NaN - - - - 6
C NaN NaN NaN NaN NaN NaN NaN NaN NaN - 9
D NaN NaN NaN NaN - - - - - - 4

我被困在

dfa.at[dfa.index, [str(col) for col in list(range(dfa['Count'].max() - dfa['Count']))]] = '-'

并获得KeyError: 'Count'

【问题讨论】:

    标签: python pandas dataframe numpy nan


    【解决方案1】:

    广播也是一种选择:

    import pandas as pd
    import numpy as np
    
    columns_name = list(str(i) for i in range(10))
    dfa = pd.DataFrame(columns=columns_name, index=['A', 'B', 'C', 'D'])
    dfa['Count'] = [10, 6, 9, 4]
    
    # Broadcast based on column index (Excluding Count)
    m = (
            dfa['Count'].to_numpy()[:, None] == np.arange(0, dfa.shape[1] - 1)
    ).cumsum(axis=1).astype(bool)
    # Grab Columns To Update
    non_count_columns = dfa.columns[dfa.columns != 'Count']
    # Update based on mask
    dfa[non_count_columns] = dfa[non_count_columns].mask(m, '-')
    
    print(dfa)
    

    输出:

         0    1    2    3    4    5    6    7    8    9  Count
    A  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN     10
    B  NaN  NaN  NaN  NaN  NaN  NaN    -    -    -    -      6
    C  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN    -      9
    D  NaN  NaN  NaN  NaN    -    -    -    -    -    -      4
    

    【讨论】:

      【解决方案2】:

      其实你这部分代码dfa.at[dfa.index, [str(col) for col in list(range(dfa['Count'].max() - dfa['Count']))]] = '-'有问题。

      只需尝试创建您尝试在理解中使用的列表

      list(range(dfa['Count'].max() - dfa['Count']))
      

      它会抛出TypeError

      如果您注意到,您会发现(dfa['Count'].max() - dfa['Count']) 将提供以下series

      A    0
      B    4
      C    1
      D    6
      

      而且由于您试图将series 传递给python 的range 函数,它会抛出错误。

      一种可能的解决方案可能是:

      for index, cols in zip(dfa.index, [list(map(str, col)) for col in (dfa).apply(lambda x: list(range(x['Count'], dfa['Count'].max())), axis=1).values]):
          dfa.loc[index, cols] = '-'
      

      输出

      Out[315]: 
           0    1    2    3    4    5    6    7    8    9  Count
      A  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN     10
      B  NaN  NaN  NaN  NaN  NaN  NaN    -    -    -    -      6
      C  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN    -      9
      D  NaN  NaN  NaN  NaN    -    -    -    -    -    -      4
      

      【讨论】:

        猜你喜欢
        • 2017-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多