Python 基于多个条件的dataframe条件列是否仅在第一个条件下工作?
我有一个类似这样的数据框:(还有大约100个与我的条件列计算无关的列) 我需要添加一列将这些值放在一起,使其看起来像这样: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
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