如果不正确,大熊猫应用lambda

时间:2018-06-20 15:40:54

标签: python-2.7 pandas lambda

具有这种格式数据的数据框

dfs = pd.read_csv('try.tsv', sep='\t')
dfs.head()
guide freq
g1   text1
g2   text1,text2,text1
g3   text1,text2,text3
g4   text1
g5   text1,text2,text3,text4,text5
g6   NaN
g7   text1,text2,text3,text4,text5,text6

填充NaN

dfs['freq'].fillna('no_guide', inplace=True)

dfs
    guide   freq
0   g1  text1
1   g2  text1,text2
2   g3  text1,text2,text3
3   g4  text1
4   g5  text1,text2,text3,text4,text5
5   g6  no_guide
6   g7  text1,text2,text3,text4,text5,text6

我需要计算在我尝试过的每一行中出现文本的次数

dfs['counts'] = dfs['freq'].str.split(',').apply(lambda x : '0' if x == 'no_guide' else len(set(x)))

我希望看到的内容(删除freq col后)

guide counts
g1   1
g2   2
g3   3
g4   1
g5   5
g6   0
g5   6

我希望看到的东西

guide counts
g1   1
g2   2
g3   3
g4   1
g5   5
g6   1 #this should be g6 0
g5   6

我在lambda子句中缺少某些内容吗?还是有另一种方式呢?

2 个答案:

答案 0 :(得分:1)

此问题是,您首先要填充NaN,然后使用.str.split(),所以等号应与列表一起使用,而不是列表的元素。您可以通过首先检查x函数中的lambda来看到这一点。

dfs['freq'].str.split(',')
#0                                       [text1]
#1                         [text1, text2, text1]
#2                         [text1, text2, text3]
#3                                       [text1]
#4           [text1, text2, text3, text4, text5]
#5                                    [no_guide]
#6    [text1, text2, text3, text4, text5, text6]

要检查的正确等式是x是否是仅其元素为'no_guide'的列表:

lambda x: 0 if x == ['no_guide'] else len(set(x))

由于len(set(x))返回一个数字,因此您可能还想返回0而不是字符串'0'。

答案 1 :(得分:1)

您可以使用此:

df['freq'].fillna('no_guide', inplace=True)
df['counts'] = df['freq'].str.split(',', expand=True)\
                         .apply(lambda x: x.str.contains('text')).sum(1)

df

输出:

  guide                                 freq  counts
0    g1                                text1     1.0
1    g2                    text1,text2,text1     3.0
2    g3                    text1,text2,text3     3.0
3    g4                                text1     1.0
4    g5        text1,text2,text3,text4,text5     5.0
5    g6                             no_guide     0.0
6    g7  text1,text2,text3,text4,text5,text6     6.0