Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于多个条件的dataframe条件列是否仅在第一个条件下工作?_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于多个条件的dataframe条件列是否仅在第一个条件下工作?

Python 基于多个条件的dataframe条件列是否仅在第一个条件下工作?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个类似这样的数据框:(还有大约100个与我的条件列计算无关的列) 我需要添加一列将这些值放在一起,使其看起来像这样: col1 col2 col3 col4 a NaN NaN a b NaN NaN b NaN a NaN a NaN b NaN b NaN NaN a a NaN Na

我有一个类似这样的数据框:(还有大约100个与我的条件列计算无关的列)

我需要添加一列将这些值放在一起,使其看起来像这样:

col1     col2     col3     col4
a        NaN      NaN      a
b        NaN      NaN      b
NaN      a        NaN      a
NaN      b        NaN      b
NaN      NaN      a        a
NaN      NaN      b        b
col1     col2     col3     col4
a        NaN      NaN      a
b        NaN      NaN      b
NaN      a        NaN      NaN
NaN      b        NaN      NaN
NaN      NaN      a        NaN
NaN      NaN      b        NaN
我尝试使用类似的方法(在其他条件下也适用,例如搜索特定字符串):

但是,这只执行第一个测试条件并将其余的设置为NaN,即使我将else条件设置为将其余的设置为空字符串。看起来是这样的:

col1     col2     col3     col4
a        NaN      NaN      a
b        NaN      NaN      b
NaN      a        NaN      a
NaN      b        NaN      b
NaN      NaN      a        a
NaN      NaN      b        b
col1     col2     col3     col4
a        NaN      NaN      a
b        NaN      NaN      b
NaN      a        NaN      NaN
NaN      b        NaN      NaN
NaN      NaN      a        NaN
NaN      NaN      b        NaN
有人能解释一下为什么这不起作用(以及这些类型的“函数”叫什么?)

编辑:为了澄清,还有其他列,但我不关心它们在计算
'col4'
堆栈和
groupby
first

argmin
lookup

numpy.选择

让我们试试看

df['col4']=df.bfill(1).iloc[:,0]
df
Out[107]: 
  col1 col2 col3 col4
0    a  NaN  NaN    a
1    b  NaN  NaN    b
2  NaN    a  NaN    a
3  NaN    b  NaN    b
4  NaN  NaN    a    a
5  NaN  NaN    b    b

如果我有大约100个其他列,并且我想选择相关的列,而不必找到它们的索引,那么这些如何工作?最后一个看起来太复杂了…创建一个新的数据框
df\u new=df[columns\u I\u care\u about]
。第一个概念是df.assign(col4=df[columns\u I\u care\u about].stack().groupby(level=0).first())
谢谢!成功了!我想更多地了解它是如何工作的。您能解释一下为什么使用stack()部分吗?我假设groupby是基于相关列将列水平折叠为非Null,如果有多个非Null列,则首先从左到右选择第一个实例?如果,假设所有三列都有非null,并且我希望col2优先于其他列呢?通过
stack
消除null是巧合<在
groupby
之后的code>first无论如何都会选择第一个非空值。我使用了
stack
,因为从语法上讲,在之后做
groupby(level=0)
比较方便。否则我必须做一些讨厌的事情,比如
df.assign(col4=df.groupby(lambda x:0,axis=1).first())
这也可以,但是bfill(1)1参数做什么,为什么需要iloc?
a = df.isna().to_numpy()
j = a.argmin(axis=1)
df.assign(col4=df.lookup(df.index, df.columns[j]))

  col1 col2 col3 col4
0    a  NaN  NaN    a
1    b  NaN  NaN    b
2  NaN    a  NaN    a
3  NaN    b  NaN    b
4  NaN  NaN    a    a
5  NaN  NaN    b    b
conditions = df.notna().to_numpy().T
selections = [c.to_numpy() for _, c in df.iteritems()]
df.assign(col4=np.select(conditions, selections))

  col1 col2 col3 col4
0    a  NaN  NaN    a
1    b  NaN  NaN    b
2  NaN    a  NaN    a
3  NaN    b  NaN    b
4  NaN  NaN    a    a
5  NaN  NaN    b    b
df['col4']=df.bfill(1).iloc[:,0]
df
Out[107]: 
  col1 col2 col3 col4
0    a  NaN  NaN    a
1    b  NaN  NaN    b
2  NaN    a  NaN    a
3  NaN    b  NaN    b
4  NaN  NaN    a    a
5  NaN  NaN    b    b