将数据帧中字符串列的唯一值转换为值为0或1的新多个标头

时间:2017-07-02 05:07:13

标签: python pandas dataframe

我有一个名为Transportation的列标题的数据框,其中包含一些Car,Bus,Ship或Nan值(缺失值)。我打算做的是提取运输中的所有独特价值(例如,身份3的人和身份6的人可能有汽车运输),然后将它们放入新的列标题中。

然后,如果id 3的传输是Car,则行标题下的行值为1,其他标题下的行值为0。对于Nan,在所有新生成的标题下,值为0。

3 个答案:

答案 0 :(得分:5)

最简单快捷的方法是使用pandas get_dummies

示例:

考虑这个DataFrame $(document).ready(function(){ let list= $('#main-list'); let button = $('#btn'); button.on('click', function(){ let value = $('#text-input').val(); list.append("<li class='dd-list-item'>" + value + "</li>"); }); button.on('click', function(){ let value = $('#text-input').val(); $(".list-menu").append("<li>" + value + "</li>"); }); });

df

如果执行此操作:

  Transportation
0            car
1            bus
2          plane
3            NaN

你得到输出:

new_df = pd.get_dummies(df,prefix='',prefix_sep='')
print(new_df)

我相信这就是你要找的东西。

答案 1 :(得分:2)

我相信这被称为分类变量的二进制编码:

def binary_encode(df, field) 
    df[df['Transportation'] == field][field] = 1
    df[df['Transportation'] != field][field] = 0

例如,如果你使用field ='Car'调用它,它将执行此操作:

df[df['Transportation'] == 'Car']['Car'] = 1
df[df['Transportation'] != 'Car']['Car'] = 0

df[df['Transportation'] == 'Car']只需选择数据框中Transportation列的值为“Car”的所有行。然后,其余部分将值1分配给这些行的Car列。

此时,Transportation列中包含其他值的行将具有NaN,我们不希望这样。因此,我们使用类似的技术将值0分配给其余部分。

答案 2 :(得分:0)

使用内置.apply函数的pandas。

在这种情况下,apply函数将把一个函数作为输入。此函数将在列系列的每个成员上运行,并生成一个新列。下面是一个使用lambda函数和inline if else语句来简洁地完成此操作的示例:

import pandas as pd
import numpy as np

# Creating a sample list which contains the transportation list
transportation_list = ["Car","Bus","Ship",np.nan,"Car","Bus","Ship",np.nan]

# Make a pandas Dataframe with a single column called transportation
df = pd.DataFrame({"Transportation":transportation_list})

# Create additional columns by applying the lambda function to each row in 
# the transportation column and set the value equal to zero or one depending 
# on equivalence to test value.
df['car'] = df["Transportation"].apply(lambda transport_type:1 if "Car" == transport_type else 0)
df['bus'] = df["Transportation"].apply(lambda transport_type:1 if "Bus" == transport_type else 0)
df['ship'] = df["Transportation"].apply(lambda transport_type:1 if "Ship" == transport_type else 0)

给出结果:

Result of code