Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-使用Lambda表达式转换数据帧中的某些列值_Python_Python 3.x_Pandas_Lambda - Fatal编程技术网

Python Pandas-使用Lambda表达式转换数据帧中的某些列值

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,这样列类别的数据将根据以下条件进行更改:

请原谅我在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 (也可以有其他类别)

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的列值,对吗?