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))