首页 > 解决方案 > 仅当行值是某个字符串时才删除具有重复列名的列

问题描述

我需要删除名称重复的列,但只删除所有行值为“nan”(作为字符串,而不是 NaN)的重复项。示例数据和预期输出如下。非常感谢!

df = pd.DataFrame({'id':[1,2,3,4],'a':[0,0,0,'nan'], 'b':['nan','nan','nan','nan'], 'c':['nan','nan','nan','nan'], 'd':[1,'nan',0,2]})

df = df.rename(columns = {'a':'a','b':'a', 'c':'b', 'd':'b'})

    id  a   a   b   b
0   1   0   nan nan 1
1   2   0   nan nan nan
2   3   0   nan nan 0
3   4   nan nan nan 2

预期产出

    id  a   b
0   1   0   1
1   2   0   nan
2   3   0   0
3   4   nan 2

标签: pythonpandasduplicatesdrop

解决方案


问题是,如果您想保留空的但唯一的列。如果不是,你可以在一行中解决它:df1 = df.dropna(how='all', axis='columns')如果你想保留它们,你可以删除它们然后重新创建它们,因为它们本质上只是空的。

输入:

df = pd.DataFrame({'id':[1,2,3,4],'a':[0,0,0,np.nan], 'b':[np.nan,np.nan,np.nan,np.nan], 'c':[np.nan,np.nan,np.nan,np.nan], 'd':[1,np.nan,0,2], 'e':[np.nan,np.nan,np.nan,np.nan]})
df = df.rename(columns = {'a':'a','b':'a', 'c':'b', 'd':'b'})

代码:

df1 = df.dropna(how='all', axis='columns').copy()
df1[list(df.columns.difference(df1.columns))] = np.nan

出去:

#    id    a    b   e
# 0   1  0.0  1.0 NaN
# 1   2  0.0  NaN NaN
# 2   3  0.0  0.0 NaN
# 3   4  NaN  2.0 NaN

推荐阅读