Pandas - 使用Lambda表达式

时间:2018-04-20 09:52:57

标签: python python-3.x pandas lambda

请原谅我对Python的相对缺乏经验,但这个问题让我一直困住了一段时间:

我有一个数据帧,df1是这样的:

ID      Hourly Rate    Category
0   8900    2.99    Car
1   9904    9.99    Car
2   6381    19.99   Bike
3   5862    2.99    Bike
4   2270    2.99    Car

(0-4只是行号)。现在我想以这样的方式制作df2:列类别的数据将根据以下条件进行更改:

如果类别是汽车:C 如果类别是自行车:B (也可以有其他类别)

即。 df2如下:

ID      Hourly Rate    Category
0   8900    2.99    C
1   9904    9.99    C
2   6381    19.99   B
3   5862    2.99    B
4   2270    2.99    C

我使用了一个非常简单的方法来使用函数中的if条件,但是想要使用Lambda函数来完成它。

2 个答案:

答案 0 :(得分:1)

如果您的值是分类,我建议使用Pandas内置类型Categorical Data

df2 = df.copy()
df2.Category = df2.Category.astype('category')
print(df2.Category.values.categories)
#Prints: Index(['Bike', 'Car'], dtype='object')

#Define your own Categories
df2.Category.values.categories = ['B', 'C']

<强>输出

ID  Hourly  Rate    Category
0   0   8900    2.99    C
1   1   9904    9.99    C
2   2   6381    19.99   B
3   3   5862    2.99    B
4   4   2270    2.99    C

答案 1 :(得分:1)

我认为最好的是使用map字典来定义catagories:

df['Category'] = df['Category'].map({'Car':'C','Bike':'B'}).fillna('No match')
print (df)
   ID  Hourly   Rate Category
0   0    8900   2.99        C
1   1    9904   9.99        C
2   2    6381  19.99        B
3   3    5862   2.99        B
4   4    2270   2.99        C

另外,为了提高内存使用率,可以使用:

df['Category'] = pd.Categorical(df['Category'].map({'Car':'C','Bike':'B'}).fillna('No match'))
print (df)
   ID  Hourly   Rate Category
0   0    8900   2.99        C
1   1    9904   9.99        C
2   2    6381  19.99        B
3   3    5862   2.99        B
4   4    2270   2.99        C

如果类别有多个值,则可以在dict列表中定义它们:

print (df)
   ID  Hourly   Rate Category
0   0    8900   2.99     Car1
1   1    9904   9.99     Car2
2   2    6381  19.99    Bike1
3   3    5862   2.99     Bike
4   4    2270   2.99      Car

d = {'C':['Car','Car1','Car2'], 'B':['Bike','Bike1','Bike2']}
d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
print (d1)
{'Car1': 'C', 'Bike': 'B', 'Bike2': 'B', 'Car2': 'C', 'Car': 'C', 'Bike1': 'B'}

df['Category'] = pd.Categorical(df['Category'].map(d1).fillna('No match'))
print (df)
   ID  Hourly   Rate Category
0   0    8900   2.99        C
1   1    9904   9.99        C
2   2    6381  19.99        B
3   3    5862   2.99        B
4   4    2270   2.99        C

编辑:

如果需要在循环中定义值,一种可能的解决方案是自定义函数:

def f(x):
    if x == 'Car':
        return 'C'
    elif x == 'Bike':
        return 'B'
    else:
        return 'No match'

df['Category'] = df['Category'].apply(f)
print (df)
   ID  Hourly   Rate Category
0   0    8900   2.99        C
1   1    9904   9.99        C
2   2    6381  19.99        B
3   3    5862   2.99        B
4   4    2270   2.99        C