我有一个Pandas 数据框df,它看起来如下:

A   B   C   D   E   F   G   H   I   J
Values                                      
A   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
B   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
C   yes NaN NaN NaN NaN NaN NaN NaN NaN NaN
D   NaN yes NaN NaN NaN NaN NaN NaN NaN NaN
E   NaN ok  ok  NaN NaN NaN NaN NaN NaN NaN
F   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
G   NaN NaN NaN ok  NaN NaN NaN NaN NaN NaN
H   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
I   yes NaN NaN NaN NaN NaN NaN NaN NaN NaN
J   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

Df.to_dict()如下所示:

{'A': {'A': nan,
  'B': nan,
  'C': 'yes',
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': 'yes',
  'J': nan},
 'B': {'A': nan,
  'B': nan,
  'C': nan,
  'D': 'yes',
  'E': 'ok',
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'C': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': 'ok',
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'D': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': 'ok',
  'H': nan,
  'I': nan,
  'J': nan},
 'E': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'F': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'G': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'H': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'I': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'J': {'A': nan,
  'B': nan,
  'C': nan,
  'D': nan,
  'E': nan,
  'F': nan,
  'G': nan,
  'H': nan,
  'I': nan,
  'J': nan},
 'To': {'A': '',
  'B': '',
  'C': 'A, ',
  'D': 'B, ',
  'E': 'B, C, ',
  'F': '',
  'G': 'D, ',
  'H': '',
  'I': 'A, ',
  'J': ''}}

我想获得一个新的列"to",它对应于每一行,其中包含具有非NaN值的列的列表,例如"yes"或"ok".

我使用以下代码完成了该操作:

df["To"] = ""

for index in df.index:
    
    for column in df.columns[:-1]:
        if pd.isnull(df.loc[index, column]) == False:
    
            df.loc[index, "To"] += column + ", "
            
df

如图所示,我创建了一个名为"to"的新列,并循环遍历每一行和每一列,以填充"to"列.

生成的数据帧如下所示:

A   B   C   D   E   F   G   H   I   J   To
Values                                          
A   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
B   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
C   yes NaN NaN NaN NaN NaN NaN NaN NaN NaN A,
D   NaN yes NaN NaN NaN NaN NaN NaN NaN NaN B,
E   NaN ok  ok  NaN NaN NaN NaN NaN NaN NaN B, C,
F   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
G   NaN NaN NaN ok  NaN NaN NaN NaN NaN NaN D,
H   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
I   yes NaN NaN NaN NaN NaN NaN NaN NaN NaN A,
J   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 

我认为这不是一个有效的过程,当数据集很大时,这是很耗时的. 有没有更短、更有效的方法在Pandas 数据框中创建这个"to"列?

推荐答案

非NaNness和列(后缀为",")的点积是实现这一点的一种方法:

In [242]: df.notna().dot(df.columns + ", ").str[:-2]
Out[242]:
A
B
C       A
D       B
E    B, C
F
G       D
H
I       A
J
dtype: object

实际情况是,df.notna()是一个True/False数据帧;然后我们将它与列名(","加上)相乘.由于在数字上下文中True为1而False为0,因此点积的行为类似于列名的 Select 器.最后我们go 掉尾部的","s.

Python相关问答推荐

Pandas 有条件轮班操作

pandas滚动和窗口中有效观察的最大数量

在Django admin中自动完成相关字段筛选

改进大型数据集的框架性能

在Python中计算连续天数

具有相同图例 colored颜色 和标签的堆叠子图

并行编程:同步进程

将一个双框爆炸到另一个双框的范围内

如何在GEKKO中使用复共轭物

PySpark:如何最有效地读取不同列位置的多个CSV文件

利用SCIPY沿第一轴对数组进行内插

设置索引值每隔17行左右更改的索引

多索引数据帧到标准索引DF

将参数从另一个python脚本中传递给main(argv

PYODBC错误(SQL包含-26272个参数标记,但提供了235872个参数,HY 000)

Pandas 数据框自定义排序功能

如何定义一个将类型与接收该类型的参数的可调用进行映射的字典?

如何将参数名作为参数传入到函数中?

as_index=False groupBy不支持count

为什么for循环中会有范围错误?