亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

熊貓系列的二進制移位

熊貓系列的二進制移位

RISEBY 2021-12-26 10:42:31
我在熊貓數據框中有一些布爾變量,我需要獲取所有唯一的元組。所以我的想法是創建一個新的變量連接值列,然后使用 pandas.DataFrame.unique() 來獲取所有唯一的元組。所以我的想法是使用二進制開發進行連接。例如,對于數據框:import pandas as pddf = 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] << ind但是,這會引發錯誤:“TypeError:<<:'Series' 和 'int' 不支持的操作數類型。我可以用 pandas.DataFrame.apply() 解決我的問題: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 )但是, apply (通常)很慢。我怎樣才能更有效地做事?
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

使用這個解決方案,只是簡化,因為排序已經交換:


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

1000行和 4 列的性能:


np.random.seed(2019)


N= 1000

df = pd.DataFrame(np.random.choice([0,1], size=(N, 4)))

df.columns = [f'v{x+1}' for x in df.columns]


In [60]: %%timeit

    ...: df['new'] = df.values.dot(1 << np.arange(df.shape[-1]))

113 μs ± 1.45 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

尤卡解決方案:


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)


查看完整回答
反對 回復 2021-12-26
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

獲得唯一的行是相同的操作drop_duplicates。(通過找到所有重復的行并刪除它們,它只留下唯一的行。)

df[["v2","v3","v4"]].drop_duplicates()


查看完整回答
反對 回復 2021-12-26
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

在回答您關于更有效替代方案的問題時,我發現列表理解確實對您有所幫助:


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)

所以 315 μs 與:


variables = ['v1', 'v2', 'v3', 'v4']

df['added'] = df['v1']

for ind, var in enumerate(variables[1:]) :

    %timeit df['added'] = df['added'] + df[var].apply(lambda x : x << ind )


500 μs ± 38.2 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

503 μs ± 32.1 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

481 μs ± 32 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

作為免責聲明,我不同意總和的價值,但這是一個不同的話題:)


查看完整回答
反對 回復 2021-12-26
  • 3 回答
  • 0 關注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號