首页 > 解决方案 > 熊猫首先从同一索引上的不同列收集非空值

问题描述

我查询了一个巨大的表,其中每列中的大多数行None对于每个单行都是 null ()(每个id行有多行id)。我想把这些压扁,这样我就每排一排id

我将提供一个输入的模拟示例:

    id  var1  var2
0   1  None  None
1   1  None     x
2   2  None     k
3   3  None  None
4   1  None  None
5   1     y   NOT
6   3     p  None
7   2    ss  None
8   2  None  None

这将是输出的模拟示例:

    id var1  var2
0   1    y     x
1   2   ss     k
2   3    p  None

请注意"NOT"from var2column 没有做到这一点,因为它是id==1.

如果每个 id 只有一个值,则以下代码段有效:

df = df.set_index('id')
cs = [df[col].dropna() for col in df]
pd.concat(cs, axis=1)

但是如果有多个值(例如NOT在示例中),则会引发错误。

有没有一种简单的方法来聚合每个列的第一个非空值id?谢谢。

这是模拟示例 pandas 数据框,我将为真实数据框提供更多列和行:

df = pd.DataFrame([[1, None, None],[1, None, "x"],[2, None, "k"],[3,None, None], [1, None, None], [1, "y", "NOT"], [3, "p", None], [2, "ss", None], [2, None, None]])

标签: pythonpandas

解决方案


idColumnName = 'id' # Define id column name
def funcGroup(x): # Define grouping function
    columns = [x for x in x.columns if x!=idColumnName] # Get columns that are not id column
    dictValues = {} # Init a dictionary
    for col_ in columns: # For each column ...
        nonNullValues = x.loc[~x[col_].isnull(), col_] # Get non null values
        firstNonNullValue = np.nan # Init result value as null
        if nonNullValues.shape[0]>0: firstNonNullValue = nonNullValues.iloc[0] # If there are not null values return first
        dictValues[col_] = firstNonNullValue # Fill the dictionary
    return pd.Series(dictValues, columns) # Return a pandas Serie

df.groupby([idColumnName]).apply(funcGroup).reset_index() # Group by your id column and apply defined function

推荐阅读