如何用Python翻转DataFrame列中二进制数的最后1/2位?
实现方案
方法一:基于数值运算(高效推荐)
翻转二进制最后1位等价于对原数值Q执行异或1操作(二进制000001),翻转最后2位等价于异或3操作(二进制000011),之后再转成6位固定长度的二进制字符串即可,这种方式比直接操作字符串效率更高。
示例代码:
import pandas as pd import numpy as np # 生成原始DataFrame df = pd.DataFrame(np.random.randint(1,3,size=(10, 8)), columns=list('ABCDEFGH')) df['Q'] = df.sum(axis=1) df['R'] = df.Q.apply(lambda x: format(int(x), '06b')) # 翻转最后1位,生成新列 df['R_flipped_last1'] = df['Q'].apply(lambda x: format(x ^ 1, '06b')) # 翻转最后2位,生成新列 df['R_flipped_last2'] = df['Q'].apply(lambda x: format(x ^ 3, '06b'))
比如原Q=12(二进制001100),翻转最后1位后变为13(001101),翻转最后2位后变为15(001111),完全符合需求。
方法二:直接操作二进制字符串
如果想直接对R列的字符串进行修改,可以通过截取字符串前缀,再翻转最后1或2位字符:
# 翻转最后1位 df['R_flipped_last1'] = df['R'].apply(lambda s: s[:-1] + ('1' if s[-1] == '0' else '0')) # 翻转最后2位 def flip_last_two_bits(s): last_two = s[-2:] flipped_bits = ''.join('1' if c == '0' else '0' for c in last_two) return s[:-2] + flipped_bits df['R_flipped_last2'] = df['R'].apply(flip_last_two_bits)
这种方式更直观,适合理解字符串操作逻辑,但处理大数据量时,效率不如数值运算方法。
内容的提问来源于stack exchange,提问作者Rupak
相关产品推荐
相关产品推荐

