请原谅我对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函数来完成它。
答案 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