我目前有一个由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)]
Run Code Online (Sandbox Code Playgroud)
在哪些年份是我正在分析的不同年份的数据框列表,其中包含列中包含一个的列,而零是包含全零的列的列表.有没有更好的方法根据条件删除列?出于某种原因,我必须检查那些列是否也在零列表中,并从零列表中删除它们以获得所有零列的列表.
unu*_*tbu 156
df.loc[:, (df != 0).any(axis=0)]
Run Code Online (Sandbox Code Playgroud)
以下是它如何工作的细分:
In [74]: import pandas as pd
In [75]: df = pd.DataFrame([[1,0,0,0], [0,0,1,0]])
In [76]: df
Out[76]:
0 1 2 3
0 1 0 0 0
1 0 0 1 0
[2 rows x 4 columns]
Run Code Online (Sandbox Code Playgroud)
df != 0创建一个布尔数据帧,其中True df为非零值:
In [77]: df != 0
Out[77]:
0 1 2 3
0 True False False False
1 False False True False
[2 rows x 4 columns]
Run Code Online (Sandbox Code Playgroud)
(df != 0).any(axis=0)返回一个布尔系列,指示哪些列具有非零条目.(该any操作将沿0轴的值 - 即沿着行 - 聚合为单个布尔值.因此,每个列的结果是一个布尔值.)
In [78]: (df != 0).any(axis=0)
Out[78]:
0 True
1 False
2 True
3 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
而且df.loc可以用来选择那些列:
In [79]: df.loc[:, (df != 0).any(axis=0)]
Out[79]:
0 2
0 1 0
1 0 1
[2 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)
要"删除"零列,请重新分配df:
df = df.loc[:, (df != 0).any(axis=0)]
Run Code Online (Sandbox Code Playgroud)
这是另一种使用方法是
df.replace(0,np.nan).dropna(axis=1,how="all")
与unutbu的解决方案相比,这种方式显然更慢:
%timeit df.loc[:, (df != 0).any(axis=0)]
652 µs ± 5.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.replace(0,np.nan).dropna(axis=1,how="all")
1.75 ms ± 9.49 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51922 次 |
| 最近记录: |