我有一个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)
有没有人对我如何获得预期的输出有任何建议?
萨姆
答案 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