Python 数据帧上两列的条件更新

Python 数据帧上两列的条件更新,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个pandas数据框,如果第二列的值不是NaN,我将尝试在其中附加两列值。重要的是,在附加这两个值之后,我需要将第二列中的值设置为NaN。我已成功连接这些值,但无法将第二列更新为NaN 这是我从ldc_df[['ad_StreetNo','ad_StreetNo2']]开始的内容。标题(5): 这是我在添加以下内容后当前拥有的内容: ad_StreetNo ad_StreetNo2 0 284 NaN 1 51 NaN 2 136 NaN 3 19

我有一个
pandas
数据框,如果第二列的值不是
NaN
,我将尝试在其中附加两列值。重要的是,在附加这两个值之后,我需要将第二列中的值设置为
NaN
。我已成功连接这些值,但无法将第二列更新为
NaN

这是我从ldc_df[['ad_StreetNo','ad_StreetNo2']]开始的内容。标题(5):

这是我在添加以下内容后当前拥有的内容:

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)
有人对我如何获得预期产出有什么建议吗

萨姆

替代解决方案

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
替代解决方案

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

pd.DataFrame.stack
将具有单级列索引的数据帧折叠到一个series对象中。在此过程中,默认情况下会删除任何空值。然后,我们可以按照前面的索引级别进行分组,并使用
'-'
进行连接

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

pd.DataFrame.stack
将具有单级列索引的数据帧折叠到一个series对象中。在此过程中,默认情况下会删除任何空值。然后,我们可以按照前面的索引级别进行分组,并使用
'-'
进行连接

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

使用
melt
df.reset_index().melt('index').dropna().groupby('index')['value'].apply(lambda x:'-'.join(x.astype(str))
使用
melt
df.reset_index().melt('index').dropna().groupby('index')['value']).apply(lambda x:'-'.join(x.astype(str))