python - 用 pandas 组合多个列

标签 python python-3.x pandas

我有一个 pandas 数据框:

Name A1 A2 A3
Andy 1 NaN NaN
Brian Nan NaN NaN
Carlos NaN 2 NaN
David NaN Nan 3
Frank 2 Nan Nan

对于每一行,在 3 列 A1A2A3 中,最多有一个非 NaN 单元格。所以我想将它们合并为一列并删除全部为 NaN 的行。所以上面的数据框将变成:

Name A A-ID
Andy 1  1
Carlos 2 2
David 3 3
Frank 2 1

A-ID 将存储原始列(A1、A2 或 A3)。包含 Brian 的行已被删除,因为所有 3 列均为 NaN。

天真地我可以编写一个for循环来完成任务,但是有没有更Pythonic和更快的方法?

最佳答案

此方法应该达到预期的结果:

import pandas as pd
import numpy as np

d = {"Name": ["Andy", "Brian", "Carlos", "David", "Frank"],
     "A1": [1,np.nan,np.nan,np.nan,2],
     "A2": [np.nan,np.nan,2,np.nan,np.nan],
     "A3": [np.nan,np.nan,np.nan,3,np.nan]}

df = pd.DataFrame(data=d)

#Drops rows where all A* values are NaN
df = df.dropna(subset = ['A1', 'A2', 'A3'], how="all")

#Sums values to produce result
df["A"] = df.sum(axis=1)

#Alternative method for getting 'A'
#df["A"] = df[["A1", "A2", "A3"]].bfill(axis=1).iloc[:, 0]

#Returns final char of column name of first non-NaN column
df["A-ID"] = df[["A1", "A2", "A3"]].apply(lambda row: row.first_valid_index()[-1], axis=1)

#Dropping old A* columns
df = df.drop(["A1", "A2", "A3"], axis=1)

print(df)

     Name    A A-ID
0    Andy  1.0    1
2  Carlos  2.0    2
3   David  3.0    3
4   Frank  2.0    1

关于python - 用 pandas 组合多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51261968/

相关文章:

python - 为什么使用 PIL 会出现颜色量化伪影?

python - 如何折叠 Pandas 数据框? (数据透视表)

python - 如何在 Scikit-Learn 中重用 LabelBinarizer 进行输入预测

python - 基本 Python 数据验证

Python导入问题

python-3.x - 弃用警告 :

python - 来自按级别分组的多索引 Pandas 数据框的子图

python - 使用 ActionChains 在 Selenium Webdriver 中按 ctrl+t 不起作用

Python float silent overflow 精度错误

python - 在 webhook 中解析 JSON