Pandas Dataframe上两列的条件更新

时间:2017-08-23 14:50:37

标签: python pandas dataframe

我有一个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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

然后我使用assign在覆盖两列时创建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