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