Skip to main content
 首页 » 编程设计

python之对于 DataFrame 的每一行,将给定条件的第一列索引放入新列中

2024年08月06日17jpfss

这是我的数据框的摘录。

data = [ 
    ['1245', np.nan, np.nan, 1.0, 1.0, ''], 
    ['1246', np.nan, 1.0, 1.0, 1.0, ''], 
    ['1247', 1.0, 1.0, 1.0, 1.0, ''], 
    ['1248', 1.0, 1.0, np.nan, np.nan, ''], 
    ['1249', np.nan, 1.0, np.nan, 1.0, ''] 
] 
 
df = pd.DataFrame(data, columns = ['city_code', 'apr_12', 'may_12', 'jul_12', 'aug_12', 'first_index']) 
 

我想用第一个“1.0”( float )所在列的索引(apr_12、may_12、jun_12 和 aug_12)填充“first_index”列。 例如,我想在第一行“2”的“first_index”列中看到,因为这是该行的第一个“1.0”的位置。这是假设的,也没有考虑“city_code”列。

仅供引用:最初,NaN 值是“0.0”( float ),但我认为使用 NaN 值和函数(例如 first_valid_index())会更容易(但我不能让它起作用...)。如果需要的话,我可以毫无问题地回零。

你们知道如何解决这个问题吗?非常感谢

请您参考如下方法:

鉴于您只有 NaN 和 1.0,您可以执行以下操作:

df['first_index'] = df[['apr_12', 'may_12', 'jul_12', 'aug_12']].fillna(0).to_numpy().argmax(1) 

结果:

  city_code  apr_12  may_12  jul_12  aug_12  first_index 
0      1245     NaN     NaN     1.0     1.0            2 
1      1246     NaN     1.0     1.0     1.0            1 
2      1247     1.0     1.0     1.0     1.0            0 
3      1248     1.0     1.0     NaN     NaN            0 
4      1249     NaN     1.0     NaN     1.0            1 

(如果您在原始版本中使用零而不是 NaN,正如您所说,那么您当然可以跳过 fillna(0))

或更短(对于带有 NaN 的 df):

df['first_index'] = np.nanargmin(df[['apr_12', 'may_12', 'jul_12', 'aug_12']], 1)