我目前有一个dataframe由1和0作为值的列组成,我想遍历列并删除仅由0组成的列。以下是我到目前为止所做的尝试:
ones = []
zeros = []
for year in years:
for i in range(0,599):
if year[str(i)].values.any() == 1:
ones.append(i)
if year[str(i)].values.all() == 0:
zeros.append(i)
for j in ones:
if j in zeros:
zeros.remove(j)
for q in zeros:
del year[str(q)]
其中years是我正在分析的各个年份的 Dataframe 列表,ones由其中包含1的列组成,zeros是包含所有零的列的列表。有没有更好的方法可以根据条件删除列?出于某种原因,我必须检查ones列是否也在zeros列表中,并将它们从zeros列表中删除,以获得所有零列的列表。
5条答案
按热度按时间wvyml7n51#
以下是它如何工作的分解:
df != 0
创建一个布尔DataFrame,它为True,其中df
为非零值:(df != 0).any(axis=0)
返回一个布尔Series,指示哪些列有非零项。(any
操作将沿着0轴(即沿行)的值聚合为一个布尔值。因此,结果是每列一个布尔值。)df.loc
可以用来选择这些列:要“删除”零列,请重新分配
df
:0ve6wy6x2#
这里有一个替代方法使用是
df.replace(0,np.nan).dropna(axis=1,how="all")
与unutbu的解决方案相比,这种方式明显要慢一些:
hgc7kmma3#
如果你想要一种更有表现力的方式来获取零列名,这样你就可以打印/记录它们,并通过它们的名称就地删除它们:
有些会崩溃:
c7rzv4ha4#
如果您的列中有一些NaN值,如果您想删除同时具有0和NaN的列,您可能需要使用这种方法:
oprakyz75#
这应该做的工作: