所以我有一个数据框:
import pandas as pd
df = pd.DataFrame({'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'score': [1, 3, 4, 5, 2]})
我想根据“得分”列中的条件创建一个新列。
我这样尝试过
df['happiness'] = df['score']
def are_you_ok(df):
if df['happiness'] >= 4:
return 'happy',
elif df['happiness'] <= 2:
return 'sad',
else:
return 'ok'
df['happines'] = df['happiness'].apply(are_you_ok)
df
不过,当我尝试运行该命令时,我得到的只是:
TypeError: 'int' object is not subscriptable
我不能将这种函数与整数一起使用吗?
答案 0 :(得分:2)
来自numpy
的{{3}}声音
import numpy as np
conds = [df.score >=4, df.score <=2]
choices = ['happy', 'sad']
df['happiness'] = np.select(conds, choices, default='ok')
>>> df
name score happiness
0 Jason 1 sad
1 Molly 3 ok
2 Tina 4 happy
3 Jake 5 happy
4 Amy 2 sad
注意:您可以避免使用numpy
(或pandas.np
,具体取决于您导入熊猫的方式)而不是pd.np
np
答案 1 :(得分:1)
使用pd.cut
pd.cut(df.score,[0,2,4,np.Inf],labels=['sad','ok','happy'])
Out[594]:
0 sad
1 ok
2 ok
3 happy
4 sad
#df['yourcol']=pd.cut(df.score,[0,2,4,np.Inf],labels=['sad','ok','happy'])
答案 2 :(得分:0)
问题是apply
将函数应用于列中的每个单个值。 df
不是DataFrame
内的are_you_ok
,而是(在您的情况下)整数。自然,Python抱怨您无法使用['happiness']
来索引整数。
您的代码很容易修复。只需重写are_you_ok
,使其可以使用整数参数即可。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
...: 'score': [1, 3, 4, 5, 2]})
...:
In [3]: def are_you_ok(x):
...: if x >= 4:
...: return 'happy'
...: elif x <= 2:
...: return 'sad'
...: else:
...: return 'ok'
...:
In [4]: df['happiness'] = df['score'].apply(are_you_ok)
In [5]: df
Out[5]:
name score happiness
0 Jason 1 sad
1 Molly 3 ok
2 Tina 4 happy
3 Jake 5 happy
4 Amy 2 sad