我查询了一个巨大的表,其中每个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]])
答案 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