相当于'if''else'条件的熊猫,将计算出的列添加到df

时间:2018-12-29 14:12:34

标签: python pandas

下表计算了文本中的唯一单词(在这种情况下为“哈姆雷特”的德语文本)。

使用熊猫,我想添加一列['frequency'],该列显示三个答案之一。

  • 如果“计数”列中的值为<= 10 ,则频率为 “不常”

  • 如果“计数”列中的值> 10 ,则频率为 “频繁”

  • 如果“计数”列中的值为1 ,则频率为“唯一”

我对熊猫是陌生的,所以我最初认为我必须使用'for'循环和'if''else'。当然,这对我不起作用,阅读完此内容后,我看到您可以改用.loc []。干净得多。

如果其他人确实需要此设置,我将在下面给出答案。这是我之前使用的桌子-

      count                 word  length
0     67223                            0
1         7               deinen       6
2         1          überwachsen      11
3         3                 them       4
4         2            fortunens       9
5         1              flammen       7
6         1    ersäuentsezlichen      17
7         2              alleino       7
8         1             empfehle       8
9         1  beschulöffentlicher      19
10        1         unterthänige      12
11        1                   pr       2
12        1       zurükzutreiben      14
13       38                   wo       2
14        1          schadhaften      11
15        1               ddiese       6
16        1         zurükhaltend      12
17        1                 laim       4
18        1               agents       6

4 个答案:

答案 0 :(得分:7)

这是pd.cut的绝佳用例:

pd.cut(df['count'], 
       bins=[-np.inf, 1, 10, np.inf], 
       labels=['unique', 'infrequent', 'frequent'])

0       frequent
1     infrequent
2         unique
3     infrequent
4     infrequent
5         unique
6         unique
7     infrequent
8         unique
9         unique
10        unique
11        unique
12        unique
13      frequent
14        unique
15        unique
16        unique
17        unique
18        unique
Name: count, dtype: category
Categories (3, object): [unique < infrequent < frequent]

在另一个答案中,np.select的缺点是您需要在选择之前评估所有条件,并且在更多条件下无法很好地扩展。

答案 1 :(得分:3)

对于多种情况,请考虑使用np.select

conditions = [data['count'] == 1, data['count'] > 10, data['count'] <= 10]
choices = ['unique', 'frequent', 'infrequent']

data['frequency'] = np.select(conditions, choices)

conditions的顺序很重要,因为您不希望data['count'] <= 10包含计数1

您可能还希望考虑使用pd.cutnp.digitize,另请参阅How to map numeric data into categories / bins in Pandas dataframe

答案 2 :(得分:1)

使用DataFrame.apply的另一种替代方法:

def frequer(wordcnt):
    if wordcnt == 1: return 'unique'
    elif wordcnt >10: return 'frequent'
    else: return 'infrequent'

df['freq'] = df.apply(lambda x: frequer(x['count']),axis=1)

输出:

enter image description here

答案 3 :(得分:0)

之后-不过请忽略第一行,它仅给出文本中唯一单词的总数。

data.loc[data["count"] > 10,  "frequency"] = "frequent"
data.loc[data["count"] <= 10, "frequency"] = "infrequent"
data.loc[data["count"] == 1,  "frequency"] = "unique"

结果:

  count                 word  length   frequency
0     67223                            0    frequent
1         7               deinen       6  infrequent
2         1          überwachsen      11      unique
3         3                 them       4  infrequent
4         2            fortunens       9  infrequent
5         1              flammen       7      unique
6         1    ersäuentsezlichen      17      unique
7         2              alleino       7  infrequent
8         1             empfehle       8      unique
9         1  beschulöffentlicher      19      unique
10        1         unterthänige      12      unique
11        1                   pr       2      unique
12        1       zurükzutreiben      14      unique
13       38                   wo       2    frequent