【问题标题】:Pandas: Generate a Dataframe column which has values depending on another column of a dataframe熊猫:生成一个数据框列,其值取决于数据框的另一列
【发布时间】:2019-04-22 13:32:49
【问题描述】:

我正在尝试生成一个 pandas 数据框,其中一列将具有基于另一个数据框中列的值的数值。下面是一个例子: 我想根据一列数据帧df_生成另一个数据帧_

ipdb> df_ = pd.DataFrame({'c1':[False, True, False, True]})
ipdb> df_
      c1
0  False
1   True
2  False
3   True

使用 df_ 生成另一个数据框 df1,其列如下。

ipdb> df1
   col1  col2
0     0   NaN
1     1   0
2     2   NaN
3     3   1

这里,'col1' 具有正常的索引值,'c1' 在 df_ 中为 False 的行中具有 NaN,并且在 'c1' 为 True 的情况下按顺序递增值。

要生成这个数据框,下面是我尝试过的。

ipdb> df_[df_['c1']==True].reset_index().reset_index()
   level_0  index    c1
0        0      1  True
1        1      3  True

但是,我觉得应该有更好的方法来生成包含 df1 中的两列的数据框。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我认为你需要cumsum 并减去1 才能从0 开始计数:

    df_ = pd.DataFrame({'c1':[False, True, False, True]})
    
    df_['col2'] = df_.loc[df_['c1'], 'c1'].cumsum().sub(1)
    print (df_)
          c1  col2
    0  False   NaN
    1   True   0.0
    2  False   NaN
    3   True   1.0
    

    另一个解决方案是通过sumnumpy.arange 计算True 值的出现次数,然后分配回过滤后的DataFrame

    df_.loc[df_['c1'],'col2']= np.arange(df_['c1'].sum())
    print (df_)
          c1  col2
    0  False   NaN
    1   True   0.0
    2  False   NaN
    3   True   1.0
    

    详情

    print (df_['c1'].sum())
    2
    
    print (np.arange(df_['c1'].sum()))
    [0 1]
    

    【讨论】:

    • 已更新,您的第二个解决方案令人印象深刻,它是 len 的替代品,干杯 +1
    • @jezrael 我正在使用你的第二种方法。新列中的值是浮点数。有没有办法将这些值作为 int 类型?我尝试将 dtype=np.int32 作为 np.arange() 的参数,但这也没有帮助。
    • @GAURAVSRIVASTAVA - 不幸的是不是,因为 NaN 值 - 它强制所有值到 float。可能的解决方案是添加1 以从1 计数并将NaNs 替换为0,如df_['col2'] = df_['col2'].add(1).fillna(0).astype(int)
    【解决方案2】:

    解决这个问题的另一种方法,

    df.loc[df['c1'],'col2']=range(len(df[df['c1']]))
    

    输出:

          c1  col2
    0  False   NaN
    1   True   0.0
    2  False   NaN
    3   True   1.0
    

    【讨论】:

    • 我认为range(len(df[df['c1']==True])) 应该简化为range(len(df[df['c1']]))
    猜你喜欢
    • 2021-04-13
    • 2016-08-09
    • 2021-07-15
    • 2019-01-20
    • 2022-01-23
    • 2023-04-03
    • 2022-01-23
    • 2018-08-03
    • 2021-10-08
    相关资源
    最近更新 更多