Python中,根据每行第一列中的值替换最后N列中的所有整数

2024-10-08 20:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用0替换数据帧最后X列中的值,用1替换thos列中的任何整数。X列由M列中的值定义

例如,如果我有一个有2个用户的df:a&;B 在过去(M)1&;分别为2个周期

A仅在最后1个周期中处于活动状态,B在最后2个周期中处于活动状态,因此我想在这些周期中用0替换NaN,用1替换任何整数,以显示它们处于活动状态

当前的结构是这样的,但扩展为100多万用户和24个周期,M可以取0到23之间的值

ID | M | P1 | P2 | P3  
A  | 1 | NaN| NaN| NaN    
B  | 2 | NaN| 4  | NaN  

如果最后M列中只有NaN,我想用0替换,如果相同列中有整数值,我想用1替换

因此,数据应该如下所示:

ID | M | P1 | P2 | P3  
A  | 1 | NaN| NaN| 0    
B  | 2 | NaN| 1  | 0  

多谢各位


Tags: 数据用户iddf定义整数nan结构
1条回答
网友
1楼 · 发布于 2024-10-08 20:22:09

尝试使用df.apply()方法,如下所示:

import pandas as pd
import numpy as np 

df = pd.DataFrame(
    {
        'ID' : ['A', 'B'],
        'M' : [1, 2],
        'P1' : [np.nan, np.nan],
        'P2' : [np.nan, 4],
        'P3' : [np.nan, np.nan]
    }
)
print(df)

返回:

  ID  M  P1   P2  P3
0  A  1 NaN  NaN NaN
1  B  2 NaN  4.0 NaN

然后我们在n_cols上使用apply函数,这是列数:

n_cols = 3
for i in range(n_cols):
    idx = 0 - (i+1)
    df.iloc[:, idx] = df.iloc[:, idx].apply(lambda x: 0.0 if np.isnan(x) else 1.0)
print(df)

返回:

  ID  M  P1   P2   P3
0  A  1 0.0  0.0  0.0
1  B  2 0.0  1.0  0.0

要使用列'M'作为列数,请执行以下操作-注意,这将较慢,因为有两个循环:

for i, n_cols in enumerate(df['M'].values):
    for j in range(n_cols):
        idx = 0 - (j+1)
        df.iloc[i, idx] = 0.0 if np.isnan(df.iloc[i, idx]) else 1.0

返回:

  ID  M  P1   P2   P3
0  A  1 NaN  NaN  0.0
1  B  2 NaN  1.0  0.0

相关问题 更多 >

    热门问题