2017-08-23 67 views
1

我有一個pandas數據幀,我試圖追加兩列值,如果第二列的值不是NaN。重要的是,在追加兩個值後,我需要將第二列的值設置爲NaN。我設法連接了這些值,但無法將第二列更新爲NaN有條件更新熊貓數據幀上的兩列

這是我開始與ldc_df[['ad_StreetNo', 'ad_StreetNo2']].head(5)

ad_StreetNo ad_StreetNo2 
0 284  NaN 
1 51  NaN 
2 136  NaN 
3 196  198 
4 227  NaN 

這是我目前有追加後:

ad_StreetNo ad_StreetNo2 
0 284  NaN 
1 51  NaN 
2 136  NaN 
3 196-198 198 
4 227  NaN 

但這裏是我試圖獲得:

ad_StreetNo ad_StreetNo2 
0 284  NaN 
1 51  NaN 
2 136  NaN 
3 196-198 NaN 
4 227  NaN 

其中ldc_df['ad_StreetNo2'].loc[3]的值應更改爲NaN

這是我目前使用的代碼:

def street_check(street_number_one, street_number_two): 

    if pd.notnull(street_number_one) and pd.notnull(street_number_two): 

     return str(street_number_one) + '-' + str(street_number_two) 

    else: 

     return street_number_one 

ldc_df['ad_StreetNo'] = ldc_df[['ad_StreetNo', 'ad_StreetNo2']].apply(lambda x: street_check(*x),axis=1) 

沒有人有任何建議,我怎麼能得到我預期的輸出?

薩姆

回答

2
# Convert the Street numbers to a string so that you can append the '-' character. 
ldc_df['ad_StreetNo'] = ldc_df['ad_StreetNo'].astype(str) 

# Create a mask of those addresses having an additional street number. 
mask = ldc_df.loc[ldc_df['ad_StreetNo2'].notnull() 

# Use the mask to append the additional street number. 
ldc_df.loc[mask, 'ad_StreetNo'] += '-' + ldc_df.loc[mask, 'ad_StreetNo2'].astype(str) 

# Set the additional street number to NaN. 
ldc_df.loc[mask, 'ad_StreetNo2'] = np.nan 

替代解決方案

ldc_df['ad_StreetNo'] = (
    ldc_df['ad_StreetNo'].astype(str) 
    + ['' if np.isnan(n) else '-{}'.format(str(int(n))) 
     for n in ldc_df['ad_StreetNo2']] 
) 
ldc_df['ad_StreetNo2'] = np.nan 
2

pd.DataFrame.stack摺疊用單個水平列索引爲一系列對象一個數據幀。一路上,它默認會刪除任何空值。然後我們可以按照之前的指數水平進行分組,並加入'-'

df.stack().astype(str).groupby(level=0).apply('-'.join) 

0  284 
1   51 
2  136 
3 196-198 
4  227 
dtype: object 

我再使用分配給創建的df一個副本,同時覆蓋兩列。 。

df.assign(
    ad_StreetNo=df.stack().astype(str).groupby(level=0).apply('-'.join), 
    ad_StreetNo2=np.NaN 
) 

    ad_StreetNo ad_StreetNo2 
0   284   NaN 
1   51   NaN 
2   136   NaN 
3  196-198   NaN 
4   227   NaN 
+1

通過使用''melt' df.reset_index()相同熔體( '索引')dropna()GROUPBY( '索引')[ '值']應用(拉姆達×:。 ' - ' 。加入(x.astype(STR)))' – Wen