我有一个CSV文件,其中包含多个重复条目。我想做的是,我需要收集那些重复的字段,并排列它们对应的字段。
我的桌子:
A列 | B列 | C列>D列||
---|---|---|---|
1004. | |||
1004。 | 3 | ||
1004。 | 2 |
您可以使用lambda函数。首先,我们按列A分组:
df=pd.DataFrame(data={'col_a':[1004,1004,1004,1005],'col_b':[1,3,2,2],'col_c':['','','',''],'col_d':['','','','']})
df=df.replace(r'^s*$',np.nan,regex=True) #replace empty cells with nan
dfx=df.groupby('col_a').agg(list)
print(dfx)
col_a col_b col_c col_d
1004 [1, 3, 2] [nan, nan, nan] [nan, nan, nan]
1005 [2] [nan] [nan]
如果有多个列,则可以替换nan值根据值的索引号在列表中:
dfx['col_c']=dfx['col_b'].apply(lambda x: x[1] if len(x) > 1 else np.nan) #get the second value from col_b
dfx['col_d']=dfx['col_b'].apply(lambda x: x[2] if len(x) > 2 else np.nan) #get the third value from col_b
dfx['col_b']=dfx['col_b'].apply(lambda x: x[0] if len(x) > 0 else np.nan) #finally replace col_b with its first value (col_b must be replaced last)
注意:如果我们先替换col_b,我们将丢失该列表。这就是我们最后替换col_b的原因。
如果有很多列,我们可以使用for循环:
loop_cols=[*dfx.columns[1:]] # get the list of columns except col_b.
list_index=1
list_lenght=1
for i in loop_cols:
dfx[i]=dfx['col_b'].apply(lambda x: x[list_index] if len(x) > list_lenght else np.nan)
list_index+=1
list_lenght+=1
#finally, replace col_b.
dfx['col_b']=dfx['col_b'].apply(lambda x: x[0] if len(x) > 0 else np.nan)
输出:
col_a col_b col_c col_d
1004 1 3.0 2.0
1005 2