我有用户ID为col1、col2的数据集.COL1仅由NaN或0组成.我想要回填col2的值,直到达到每个用户id的col1==0,并且限制为10.如果距离小于或等于10行,则回填到col1==0.如果是那样的话,什么都别做.

输入:

user_id   col1   col2          
  3        NaN    NaN
  3        0      NaN
  3        NaN    NaN 
  3        NaN     5
  5        0       NaN
  5        NaN     9
 ...  

请注意,情况并非如此.

user_id   col1   col2          
  3        NaN    NaN
  3        0       5
  3        NaN     5 
  3        NaN     5
  5        0       9
  5        NaN     9
 ...  

    

推荐答案

创建包含user_idcol1的组:

df['col2'] = df.groupby(['user_id', df['col1'].eq(0).cumsum()])['col2'].bfill()
print(df)

# Output
   user_id  col1  col2
0        3   NaN   NaN
1        3   0.0   5.0
2        3   NaN   5.0
3        3   NaN   5.0
4        5   0.0   9.0
5        5   NaN   9.0

有关组的详细信息:

>>> pd.concat([df['user_id'], df['col1'].eq(0).cumsum()], axis=1)
   user_id  col1
0        3     0  # first group (nothing to backfill)
1        3     1  # second group (backfill 5)
2        3     1
3        3     1
4        5     2  # third group (backfill 9)
5        5     2

Update:

如果距离小于或等于10行,则回填到col1==0.如果是那样的话,什么都别做.

bfill = lambda x: x.bfill() if len(x) < 10 else x
df['col2'] = df.groupby(['user_id', df['col1'].eq(0).cumsum()])['col2'].transform(bfill)

重要说明:groupby_bfill有一个limit参数来限制要填充的值的数量.您可以填充到10个值,然后停止填充.

Python相关问答推荐

Django管理面板显示字段最大长度而不是字段名称

将整组数组拆分为最小值与最大值之和的子数组

numba jitClass,记录类型为字符串

输出中带有南的亚麻神经网络

如何找到满足各组口罩条件的第一行?

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

如何设置视频语言时上传到YouTube与Python API客户端

Python Pandas获取层次路径直到顶层管理

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Flask运行时无法在Python中打印到控制台

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

使用polars. pivot()旋转一个框架(类似于R中的pivot_longer)

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

PySpark:如何最有效地读取不同列位置的多个CSV文件

一维不匹配两个数组上的广义ufunc

VSCode Pylance假阳性(?)对ImportError的react

如何通过特定导入在类中执行Python代码

为什么内置的sorted()对于一个包含降序数字的列表来说,如果每个数字连续出现两次,会变慢?