【问题标题】:Propagate values from multiple columns to a single column - Pandas将值从多列传播到单列 - Pandas
【发布时间】:2019-05-03 08:27:29
【问题描述】:
 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

我有列,我必须检查是否有任何 NaN 值存在于一列中,即使值使用 pandas 存在,也必须在组合列中更新。

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])

但值没有改变。

df.T.bfill().iloc[-1]

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

【问题讨论】:

  • df.combined.fillna(value=df[col]) 这意味着您正在使用来自df[col] 的值填充组合列的 nan 值。这就是它不起作用的原因。
  • @MohitMotwani 它不是重复的。您链接的那个和这个是不同的问题
  • 列中有space,列中有NaN

标签: pandas


【解决方案1】:

np.whereisnasum 一起使用

# 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

【讨论】:

  • 我已将 1 更改为 3,因为这是检查的正确条件。
  • @MohitMotwani 为什么是 3?如果空格只是字符串怎么办?
  • 嗯。好问题。我假设,空格是空的。可以跟OP确认吗?如果所有空格都为空,则您之前的代码不起作用。但如果它们是空字符串,这将不起作用。
  • @MohitMotwani 我认为它是基于列中NaN 的字符串,也许我们必须与 OP 确认这一点
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2016-03-26
    • 2019-06-22
    • 2018-09-26
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多