如何将行中的值替换为行中的第一个非零值?

2024-09-28 19:35:45 发布

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

我正在尝试替换行中长度为>;的所有值;第一个非零值为0。如果行的长度为0,则将其替换为float 0.0

这是预期的输入:

    VOL1    VOL2    D
    0       1       3
    21      21      
    19      0       0
    18      0       

这是预期输出:

    VOL1    VOL2    D
    1       1       1
    21      21      0.0
    19      19      19  
    18      18      0.0

到目前为止,我一直在尝试:

import pandas as pd
import numpy as np

data = {
        'VOL1':[0, 21, 19, 18],
        'VOL2':[1, 21, 0, 0],
       }
 
# Create DataFrame
df = pd.DataFrame(data)
df['D'] = [3,"",0,""]

#get first nonzero
first_nonzero_df = df[df!=0].cumsum(axis=1).min(axis=1)
if df.isnull().any(axis=1):
  df.any(axis=1).replace(df, first_nonzero_df)

我不清楚我在这里做错了什么,非常感谢您的帮助。谢谢


Tags: importgtdataframepandasdfdataasany
2条回答
import pandas as pd
data = {
        'VOL1':[0, 21, 19, 18],
        'VOL2':[1, 21, 0, 0],
       }
 
# Create DataFrame
df = pd.DataFrame(data)
df['D'] = [None] * len(df)

first_nonzero_df = df[df!=0].cumsum(axis=1).min(axis=1)

keys = df.keys()
for i in range(len(df)):
    for j in range(len(keys)):
        if df[f'{keys[j]}'][i] == 0:
            df[f'{keys[j]}'][i] = first_nonzero_df[i]
df = df.fillna(0)
df

输出:

enter image description here

IIUC,试试:

>>> df.where(df!=0, df[df!=0].ffill(axis=1).bfill(axis=1)).replace("",0)
   VOL1  VOL2     D
0     1     1   3.0
1    21    21   0.0
2    19    19  19.0
3    18    18   0.0

相关问题 更多 >