【问题标题】:How to replace different binary values across columns into 1/0如何将跨列的不同二进制值替换为 1/0
【发布时间】:2019-07-29 17:00:05
【问题描述】:

我有一个数据集包含多个二进制值。

df = pd.DataFrame({"a": ["y", "n"], "b": ["t", "f"], 
                   "c": ["known", "unknown"], "d": ['found', 'not found']})

我想将所有二进制列替换为 1/0,同时不影响其他数字列。有没有使用一两条线的简单解决方案?数据集包含 500 多列,很难一一检查和替换。谢谢。

【问题讨论】:

  • 欢迎来到 SO。请查看How to Ask,并创建一个minimal reproducible example。这意味着没有损坏的示例代码供其他人测试。您当前的示例代码不是有效的python,因此很难提供帮助。
  • astype('category')?
  • 如果这些只是二进制文件,并且您并不特别在意选择哪一个:pd.get_dummies(df).iloc[:, ::2]。否则,请提供更完整的示例和您需要的说明。
  • df.assign(**df.select_dtypes(object).apply(lambda c: c.factorize()[0]))
  • 但是对于“其他 500 列”,我们需要更多的约束。 every 对象列是否保证是您需要转换的二进制列?如果没有,我认为您至少需要一些模式或特定列的列表来进行转换。或者我们可以试试nunique == 2

标签: python pandas binary multiple-conditions


【解决方案1】:

可以使用pd.get_dummiesdrop_first=True 归功于@piRSquared

pd.get_dummies(df, drop_first=True)

#   a_y  b_t  c_unknown  d_not found
#0    1    1          0            0
#1    0    0          1            1

如果只需要首先对二进制对象列子集执行此操作。

df = pd.DataFrame({'a': ['y', 'n', 'c'], 
                   'b': ['t', 'f', 't'], 
                   'c': ['known', 'unknown', 'known'],
                   'd': ['found', 'not found', 'found'],
                   'e': [1, 2, 2]})

pd.get_dummies(df.loc[:, df.agg('nunique') == 2].select_dtypes(include='object'), 
               drop_first=True)

#   b_t  c_unknown  d_not found
#0    1          0            0
#1    0          1            1
#2    1          0            0

如果跨列存在少量二进制响应,请考虑创建字典并映射值:

d = {'y': 1, 'n': 0,
     't': 1, 'f': 0,
     'known': 1, 'unknown': 0,
     'found': 1, 'not found': 0}

s = (df.agg('nunique') == 2) & (df.dtypes == 'object')
for col in s[s].index:
    df[col] = df[col].map(d)

#   a  b  c  d  e
#0  y  1  1  1  1
#1  n  0  0  0  2
#2  c  1  1  1  2
#   |
#  `a` not mapped because trinary

【讨论】:

  • 谢谢,但如何确定 get_dummies 将值 1 分配给 'T'、'known'、'y'、'found',否则为 0?如果我不想更改列名怎么办?
  • @SHendricks 当数据混乱时,没有一个简单的线路来处理它。您将需要指定映射,以便我们知道“known = 1”而不是相反。我认为任何确定这一点的自然语言处理对于这样的事情都可能是绝对的矫枉过正,你可以用更少的时间投入进行硬编码。如果所有 500 列都有 500 个不同的二进制响应,那么您将不得不硬着头皮按您的意愿编写代码。
猜你喜欢
  • 2013-01-09
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2017-04-25
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多