Python 熊猫级数的二进制移位
在熊猫数据帧中有一些布尔变量,我需要得到所有唯一的元组。所以我的想法是创建一个新的列,其中包含变量的串联值,然后使用pandas.DataFrame.unique()来获取所有唯一元组 所以我的想法是使用二进制开发来连接。例如,对于数据帧:Python 熊猫级数的二进制移位,python,pandas,Python,Pandas,在熊猫数据帧中有一些布尔变量,我需要得到所有唯一的元组。所以我的想法是创建一个新的列,其中包含变量的串联值,然后使用pandas.DataFrame.unique()来获取所有唯一元组 所以我的想法是使用二进制开发来连接。例如,对于数据帧: import pandas as pd df = pd.DataFrame({'v1':[0,1,0,0,1],'v2':[0,0,0,1,1], 'v3':[0,1,1,0,1], 'v4':[0,1,1,1,1]}) 我可以创建这样一个列: df['a
import pandas as pd
df = pd.DataFrame({'v1':[0,1,0,0,1],'v2':[0,0,0,1,1], 'v3':[0,1,1,0,1], 'v4':[0,1,1,1,1]})
我可以创建这样一个列:
df['added'] = df['v1'] + df['v2']*2 + df['v3']*4 + df['v4']*8
variables = ['v1', 'v2', 'v3', 'v4']
df['added'] = df['v1']
for ind, var in enumerate(variables[1:]) :
df['added'] = df['added'] + df[var].apply(lambda x : x << ind )
我的想法是在这样的变量列表上迭代(应该注意,在我真正的问题上,我不知道列的数量):
variables=['v1','v2','v3','v4']
df['added']=df['v1']
对于ind,枚举中的var(变量[1:]):
df['added']=df['added']+df[var]将唯一行作为删除重复项
。(通过查找所有重复的行并删除它们,只留下唯一的行。)
获取唯一的行作为删除重复项
。(通过查找所有重复的行并删除它们,只留下唯一的行。)
使用,仅简化,因为订单已交换:
df['new'] = df.values.dot(1 << np.arange(df.shape[-1]))
print (df)
v1 v2 v3 v4 new
0 0 0 0 0 0
1 1 0 1 1 13
2 0 0 1 1 12
3 0 1 0 1 10
4 1 1 1 1 15
尤卡解决方案:
In [65]: %%timeit
...: variables = ['v1', 'v2', 'v3', 'v4']
...: df['added'] = df['v1']
...: for ind, var in enumerate(variables[1:]) :
...: df['added'] = df['added'] + [x<<ind for x in df[var]]
...:
1.82 ms ± 16.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [66]: %%timeit
...: variables = ['v1', 'v2', 'v3', 'v4']
...: df['added'] = df['v1']
...: for ind, var in enumerate(variables[1:]) :
...: df['added'] = df['added'] + df[var].apply(lambda x : x << ind )
...:
3.14 ms ± 8.52 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
[65]中的:%%timeit
…:变量=['v1',v2',v3',v4']
…:df['added']=df['v1']
…:对于ind,枚举中的var(变量[1:]):
…:df['added']=df['added']+[x使用,仅进行简化,因为订单已交换:
df['new'] = df.values.dot(1 << np.arange(df.shape[-1]))
print (df)
v1 v2 v3 v4 new
0 0 0 0 0 0
1 1 0 1 1 13
2 0 0 1 1 12
3 0 1 0 1 10
4 1 1 1 1 15
尤卡解决方案:
In [65]: %%timeit
...: variables = ['v1', 'v2', 'v3', 'v4']
...: df['added'] = df['v1']
...: for ind, var in enumerate(variables[1:]) :
...: df['added'] = df['added'] + [x<<ind for x in df[var]]
...:
1.82 ms ± 16.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [66]: %%timeit
...: variables = ['v1', 'v2', 'v3', 'v4']
...: df['added'] = df['v1']
...: for ind, var in enumerate(variables[1:]) :
...: df['added'] = df['added'] + df[var].apply(lambda x : x << ind )
...:
3.14 ms ± 8.52 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
[65]中的:%%timeit
…:变量=['v1',v2',v3',v4']
…:df['added']=df['v1']
…:对于ind,枚举中的var(变量[1:]):
…:df['added']=df['added']+[x回答您关于更有效的替代方案的问题,我发现列表理解确实对您有所帮助:
variables = ['v1', 'v2', 'v3', 'v4']
df['added'] = df['v1']
for ind, var in enumerate(variables[1:]) :
%timeit df['added'] = df['added'] + [x<<ind for x in df[var]]
308 µs ± 22.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
322 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
316 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
variables=['v1','v2','v3','v4']
df['added']=df['v1']
对于ind,枚举中的var(变量[1:]):
%timeit df['added']=df['added']+[x回答您关于更有效的替代方案的问题,我发现列表理解确实对您有所帮助:
variables = ['v1', 'v2', 'v3', 'v4']
df['added'] = df['v1']
for ind, var in enumerate(variables[1:]) :
%timeit df['added'] = df['added'] + [x<<ind for x in df[var]]
308 µs ± 22.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
322 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
316 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
variables=['v1','v2','v3','v4']
df['added']=df['v1']
对于ind,枚举中的var(变量[1:]):
%timeit df['added']=df['added']+[X你的代码有点奇怪,df['var']
应该是df[var]
否?是的,当然,谢谢(修复了这个)!你的代码有点奇怪,df['var']
应该是df[var]
否?是的,当然,谢谢(修复了这个)!当然,非常感谢。我给了你+1,但由于问题主要是关于熊猫系列的二进制移位,我不得不接受关于这一问题的正确答案。这对meSure来说很有意义,非常感谢。我给了你+1,但由于问题主要是关于熊猫系列的二进制移位,我不得不接受关于这一问题的正确答案。对于您的解决方案,这对我来说是有意义的+1。但是,它要么消耗内存(创建数组a)或者重复操作df.values两次,所以我不确定这是最好的方法…@MatinaG-不明白,为什么要重复两次?在我看来,这应该是最理想的解决方案-因为只处理所有数据一次,而不是按每列单独循环。您或者将df.values存储在单独的变量(a)中或者,如果您不这样做,您必须执行类似df['new']=df.values.dot(1@MatinaG-我使用避免双df.values
获得更好的解决方案,还为您的解决方案添加了比较性能的计时。+1。但是,它要么消耗内存(创建数组a)或者重复操作df.values两次,所以我不确定这是最好的方法…@MatinaG-不明白,为什么要重复两次?在我看来,这应该是最理想的解决方案-因为只处理所有数据一次,而不是按每列单独循环。您或者将df.values存储在单独的变量(a)中或者,如果您不这样做,您必须执行类似于df['new']=df.values.dot(1@MatinaG-我使用避免双重df.values
获得更好的解决方案,还添加了用于比较性能的计时。