我知道一种方法是遍历所有列,例如,
for col in df.columns: assert (df[col] != 0).sum() == 0
字符串有没有更好的方法可以在整个框架上操作,而不需要循环遍历每个单独的列?
u59ebvdq1#
出于好奇,我测试了这里给出的答案中的方法,我在StackOverflow的其他地方发现了类似的问题。下面是方法:
funcs = { 'tdelaney' : lambda df:not df.any(axis=None), 'Goku 1' : lambda df:(df == 0).all(axis=None), 'Goku 2' : lambda df:all((df == 0).all()), 'kevin41' : lambda df:(0 == df.to_numpy()).all(), 'other 1' : lambda df:not np.any(df), 'other 2' : lambda df:(df != 0).sum().sum() == 0, 'other 3' : lambda df:(df != 0).any(axis=None) }
字符串为了测试,我使用了一个1000行1000列的点阵,其中所有的列都是零,另外三个1的值分别为[1,1]、[499,499]和[999,999]:
1
[1,1]
[499,499]
[999,999]
N = 1000 df0 = pd.DataFrame(np.zeros([N,N])) df_low = pd.DataFrame(np.zeros([N,N])) df_mid = pd.DataFrame(np.zeros([N,N])) df_high = pd.DataFrame(np.zeros([N,N])) df_low.loc[1, 1] = 1 df_mid.loc[N//2-1, N//2-1] = 1 df_high.loc[N-1, N-1] = 1
型然后,我在一个循环中迭代了函数和嵌套(打印只是为了为SO做表格标记):
for name, func in funcs.items(): print(f'| {name} ', end='') for df in dfs.values(): time = timeit.timeit(setup='import pandas as pd, numpy as np', stmt='res = func(df)',number=1000,globals=locals()) print(f'| {time:.3f} ', end='') print('|')
型结果如下:| 方法|零|低|中期|高|| --|--|--|--|--|| 特德莱尼|0.846|八四○|零点八三|零点八五四|| 悟空1| 0.331| 0.321|零点三一六|零点三一三|| 悟空2|零点三二|0.299| 0.309| 0.326|| kevin41| 0.139|零点一四|零点一四五|零点一三八|| 其他1|八百|零七八零|0.784|七九零|| 其他2| 0.821| 0.818|零点八一六|0.842|| 其他3| 0.325|零点三一五|0.312|零点三一四|可以看出,kevin 41给出的答案是- * 对于这个样本数据 * -比次优解快两倍多。之后,小悟空的解决方案和“其他3”解决方案彼此差不多,最后三个解决方案比那些解决方案慢2.5倍。有趣的是,df_low和df_high的时间对于每种方法都是一致的,这表明没有发生短路。
df_low
df_high
mbzjlibv2#
这个函数将返回True如果所有的值在一个df是0和False如果不是。
True
False
def is_zero(df): vals = df.to_numpy() return (0 == vals).all()
字符串
kfgdxczn3#
@Mark评论道:你可以试试:
(df == 0).all() #output Col_1 True Col_2 True dtype: bool
字符串它将给予单个列的结果,如Col_1都是0; Col_2都是0如果您这样做:
Col_1
0
Col_2
(df == 0).all(axis=None)
型它将给予整个 Dataframe您还可以:
all((df == 0).all())
型
nimxete24#
看看这个:df.isin([0]).sum()
krugob8w5#
你可以检查是否有不为0的值,然后取反。使用嵌套框架的.any方法和轴None来检查所有值。这应该在第一个非零值上停止,这比sum或df == 0更好,这将构建一个全新的系列或嵌套框架。
.any
sum
df == 0
not df.any(axis=None)
5条答案
按热度按时间u59ebvdq1#
出于好奇,我测试了这里给出的答案中的方法,我在StackOverflow的其他地方发现了类似的问题。下面是方法:
字符串
为了测试,我使用了一个1000行1000列的点阵,其中所有的列都是零,另外三个
1
的值分别为[1,1]
、[499,499]
和[999,999]
:型
然后,我在一个循环中迭代了函数和嵌套(打印只是为了为SO做表格标记):
型
结果如下:
| 方法|零|低|中期|高|
| --|--|--|--|--|
| 特德莱尼|0.846|八四○|零点八三|零点八五四|
| 悟空1| 0.331| 0.321|零点三一六|零点三一三|
| 悟空2|零点三二|0.299| 0.309| 0.326|
| kevin41| 0.139|零点一四|零点一四五|零点一三八|
| 其他1|八百|零七八零|0.784|七九零|
| 其他2| 0.821| 0.818|零点八一六|0.842|
| 其他3| 0.325|零点三一五|0.312|零点三一四|
可以看出,kevin 41给出的答案是- * 对于这个样本数据 * -比次优解快两倍多。之后,小悟空的解决方案和“其他3”解决方案彼此差不多,最后三个解决方案比那些解决方案慢2.5倍。
有趣的是,
df_low
和df_high
的时间对于每种方法都是一致的,这表明没有发生短路。mbzjlibv2#
这个函数将返回
True
如果所有的值在一个df是0和False
如果不是。字符串
kfgdxczn3#
@Mark评论道:
你可以试试:
字符串
它将给予单个列的结果,如
Col_1
都是0
;Col_2
都是0
如果您这样做:
型
它将给予整个 Dataframe
您还可以:
型
nimxete24#
看看这个:
df.isin([0]).sum()
krugob8w5#
你可以检查是否有不为0的值,然后取反。使用嵌套框架的
.any
方法和轴None来检查所有值。这应该在第一个非零值上停止,这比sum
或df == 0
更好,这将构建一个全新的系列或嵌套框架。字符串