Python Pandas-使用Lambda表达式转换数据帧中的某些列值
请原谅我在Python方面相对缺乏经验,但这个问题让我陷入困境已有一段时间了: 我有一个数据帧,df1如下:Python Pandas-使用Lambda表达式转换数据帧中的某些列值,python,python-3.x,pandas,lambda,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,这样列类别的数据将根据以下条件进行更改:
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
(也可以有其他类别)
i、 e.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函数来实现。如果您的值是分类的,我建议使用内置类型 输出
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
如果您的值是分类的,我建议使用
Pandas
内置类型
输出
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'] = 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
如果类别可能有多个值,请在目录列表中定义它们:
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
我认为字典在定义类别时最好使用:
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
如果类别可能有多个值,请在目录列表中定义它们:
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
你想让类别以第一个字母表为基础吗?@shivsn:谢谢!分类可以是任何值-没有那样的相关性。你想让分类基于它的第一个字母表吗?@shivsn:谢谢!顺便说一下,类别可以是任何值-没有那样的相关性。非常感谢。我们可以用lambda表达式(没有映射)来做同样的事情吗?@TalhaIrfan-当然,给我一个答案sec@TalhaIrfan,为什么要为此使用
lambda
?这是不必要的,而且效率低下。@jpp:谢谢你的建议@TalhaIrfan-如果想要lambda-df['Category']=df['Category']。应用(lambda x:'C'如果x='Car'else'B')
,但它总是很慢,并且只对Car
的设置类别和所有其他设置为B
的值起作用。但我认为你有更多的分类,所以可能的低效解决方案应该是重复df['Category']=df['Category'].apply(lambda x:'C'if x=='Car'else x)
和df['Category']=df['Category'])。apply(lambda x:'B'if x=='Bike'else x)
什么是非常缓慢和丑陋的。非常感谢。我们可以用lambda表达式(没有映射)来做同样的事情吗?@TalhaIrfan-当然,给我一个答案sec@TalhaIrfan,为什么要为此使用lambda
?这是不必要的,而且效率低下。@jpp:谢谢你的建议@TalhaIrfan-如果想要lambda-df['Category']=df['Category']。应用(lambda x:'C'如果x='Car'else'B')
,但它总是很慢,并且只对Car
的设置类别和所有其他设置为B
的值起作用。但我认为你有更多的分类,所以可能的低效解决方案应该是重复df['Category']=df['Category'].apply(lambda x:C'if x=='Car'else x)
和df['Category']=df['Category'])。apply(lambda x:'B'if x=='Bike'else x)
什么是非常缓慢和丑陋的。不,Category
是提供的df中的列名。我使用astype('category')
转换了它,这是工作代码。很抱歉,我没有正确检查。它确实工作得很好。它按字母顺序将类别(您在最后一行中提供的类别)应用于df1的列值,对吗?不,Category
是提供的df中的列名。我使用astype('category')
转换了它,这是工作代码。很抱歉,我没有正确检查。它确实工作得很好。它按字母顺序将类别(您在最后一行中提供的类别)应用于df1的列值,对吗?