具有这种格式数据的数据框
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子句中缺少某些内容吗?还是有另一种方式呢?
答案 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