Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫级数的二进制移位_Python_Pandas - Fatal编程技术网

Python 熊猫级数的二进制移位

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

在熊猫数据帧中有一些布尔变量,我需要得到所有唯一的元组。所以我的想法是创建一个新的列,其中包含变量的串联值,然后使用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['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
获得更好的解决方案,还添加了用于比较性能的计时。