Pandas 将值从多列传播到单列-复制

Pandas 将值从多列传播到单列-复制,pandas,Pandas,我有列,我必须检查一列中是否存在任何NaN值,并且必须在组合列eventhough中使用pandas更新相同的NaN值 col1 col2 col3 combined ---------------------------- val1 val1 val1 val1 NaN val1 val1 val1 val2

我有列,我必须检查一列中是否存在任何NaN值,并且必须在组合列eventhough中使用pandas更新相同的NaN值

 col1   col2    col3   combined
----------------------------
val1                   val1
val1                   val1
NaN                    val1
val1                   val1
       val2            val2
       NaN             val2
       val2            val2
              val3     val3
              NaN      val3
              val3     val3 

output:
-------
col1   col2    col3   combined
----------------------------
val1                   val1
val1                   val1
NaN                    NaN
val1                   val1
       val2            val2
       NaN             NaN
       val2            val2
              val3     val3
              NaN      NaN
              val3     val3
但价值并没有改变

i am using the follwing code:
cols = df[0:len(df.columns)-1]
for col in cols:
    print (col)
    df.combined = df.combined.fillna(value=df[col])

如果我使用bfill,则即使存在NaN,它也会填充值。

我迭代行并使用
isna()
查找NaN,并在“组合”列中为NaN分配相应的索引


我迭代行并使用
isna()
查找NaN,并在“组合”列中为NaN分配相应的索引


np.where
isna
sum

import pandas as pd
import numpy as np

### Generate sample data
arr = np.zeros((9,3))
comb = np.zeros(9)
for i in range(3):
    val = np.random.randint(-5,5)
    for ji in range(i*3,i*3+3):
        arr[ji,i] = val
    a_rand_row = np.random.randint(i*3,i*3+3)
    arr[a_rand_row,i] = np.nan

    comb[i*3:i*3+3] = val
    comb[a_rand_row] = val

init_cols = ["col1","col2","col3"]
df = pd.DataFrame(arr, columns=init_cols)
df["comb"] = comb

### iterate over columns and set comb to nan if column is nan
for col in init_cols:
    df["comb"][df[col].isna()] = np.nan

np.where
isna
sum

import pandas as pd
import numpy as np

### Generate sample data
arr = np.zeros((9,3))
comb = np.zeros(9)
for i in range(3):
    val = np.random.randint(-5,5)
    for ji in range(i*3,i*3+3):
        arr[ji,i] = val
    a_rand_row = np.random.randint(i*3,i*3+3)
    arr[a_rand_row,i] = np.nan

    comb[i*3:i*3+3] = val
    comb[a_rand_row] = val

init_cols = ["col1","col2","col3"]
df = pd.DataFrame(arr, columns=init_cols)
df["comb"] = comb

### iterate over columns and set comb to nan if column is nan
for col in init_cols:
    df["comb"][df[col].isna()] = np.nan

df.combined.fillna(value=df[col])
这意味着您正在用
df[col]
中的值填充组合列的nan值。这就是它不起作用的原因。@MohitMotwani的可能复制品不是复制品。你链接的那一个和这一个是不同的问题,它们在列中是
space
,在列中是
NaN
df.combined.fillna(value=df[col])
这意味着你在用
df[col]中的值填充组合列的NaN值。这就是它不起作用的原因。@MohitMotwani的可能复制品不是复制品。你链接的那一个和这一个是不同的问题列中有
space
,列中有
NaN
?我已将1更改为3,因为这是要检查的正确条件。@MohitMotwani为什么是3?如果一个空格就是字符串呢?嗯,好问题。我假设空白空间是空的。你能和OP确认一下吗?如果所有空格都为空,则表示以前的代码无效。但是,如果它们是空字符串,这将不起作用。@MohitMotwani我认为它是基于列中的
NaN
的字符串。也许我们必须用OPI确认这一点。我们已经将1更改为3,因为这是检查的正确条件。@MohitMotwani为什么是3?如果一个空格就是字符串呢?嗯,好问题。我假设空白空间是空的。你能和OP确认一下吗?如果所有空格都为空,则表示以前的代码无效。但如果它们是空字符串,这将不起作用。@MohitMotwani我认为这是基于列中的
NaN
的字符串,也许我们必须与OP确认这一点
# Change 1 to 3 if the blank space is None or NaN thanks to @Mohit Motwani
df['combined'] = np.where(df.isna().sum(axis=1) >= 1, np.nan, df.combined)

df
Out[34]: 
   col1  col2  col3 combined
0  val1                 val1
1  val1                 val1
2   NaN                  NaN
3  val1                 val1
4        val2           val2
5         NaN            NaN
6        val2           val2
7              val3     val3
8               NaN      NaN
9              val3     val3