用Pandas组合几列

2024-05-15 10:39:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框:

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循环来完成这项任务,但是有没有更具python风格和更快的方法呢


Tags: 数据franknameida2for风格a1
2条回答

有几种方法可以做到这一点。最简单的可能是定义一个新列,它是其他列的总和或串联

df["B"] = df["A1"] + df["A2"] + df["A3"]

然后,只保留B不为null的行

df = df[df.B.notnull()]

问候

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

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

相关问题 更多 >