熊猫首先从同一索引的不同列中收集非空值

时间:2019-03-18 18:55:29

标签: python pandas

我查询了一个巨大的表,其中每个None的每一行中的大多数行均为空(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"列中的var2未能做到这一点,因为它是id==1的第二个非空值。

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

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

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

是否有一种简单的方法来汇总每个id的每一列的第一个非空值?谢谢。

这是模拟的熊猫数据框示例,我将为真实数据框添加更多的行和列:

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]])

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用first : first not null value will be returned

进行检查
df.groupby(0).first().reset_index()
Out[582]: 
   0     1     2
0  1  None  None
1  2  None     k
2  3  None  None