我有一个叫做df
的数据框,它看起来类似于这个例子(除了'mat_deliv'列的数量会增加到mat_deliv_8,有数百个客户和一些在Client_ID和mat_deliv_1之间的其他列 - 这里我简化了它)。
Client_ID mat_deliv_1 mat_deliv_2 mat_deliv_3 mat_deliv_4
C1019876 xxx,yyy,zzz aaa,bbb,xxx xxx ddd
C1018765 yyy,zzz xxx xxx None
C1017654 yyy,xxx aaa,bbb ccc ddd
C1016543 aaa,bbb ccc None None
C1019876 yyy None None None
我想创建一个名为
xxx_count
的新列,它统计在mat_deliv_1
、mat_deliv_2
、mat_deliv_3
和mat_deliv_4
中出现xxx
的次数。值应该如下所示:Client_ID mat_deliv_1 mat_deliv_2 mat_deliv_3 mat_deliv_4 xxx_count
C1019876 xxx,yyy,zzz aaa,xxx,bbb xxx ddd 3
C1018765 yyy,zzz xxx xxx None 2
C1017654 yyy,xxx aaa,bbb ccc ddd 1
C1016543 aaa,bbb ccc None None 0
C1015432 yyy None None None 0
我尝试了以下代码:
df = df.assign(xxx_count=df.loc[:, "mat_deliv_1":"mat_deliv_4"].\
apply(lambda col: col.str.count('xxx')).fillna(0).astype(int))
但它并不产生计数,只有一个二进制变量,其中
0
表示没有xxx
的情况,1
表示在四个mat_deliv
列中至少存在一个xxx
。注:这是对此处提出的跟进问题:Creating a column based on the presence of part of a string in multiple other columns
count
函数将包含一个较大字符串内的匹配子字符串,例如xxx
和xxxx
都会被计数。如果这样可以接受,那么就没问题。如果不可接受,那么就需要进行相等性测试,例如:[sum(1 for word in ','.join(row).split(',') if word == 'xxx') for row in df.loc[:, "mat_deliv_1":"mat_deliv_4"].fillna('').values]
。 - Alexander